From fc8efdef9273d42a4c734a8b3d507ff9428c710d Mon Sep 17 00:00:00 2001 From: Jordan Munch O'Hare Date: Sun, 29 Nov 2020 11:23:46 +0100 Subject: [PATCH 1/3] Note Model From HTML Files --- .../crowd_anki/crowd_anki_generate.py | 2 +- .../crowd_anki/note_models_to_crowd_anki.py | 10 +- .../deck_parts/note_model_from_html_parts.py | 77 ++++++++++ .../note_model_template_from_html_files.py | 88 +++++++++++ .../representation/build_config/build_task.py | 9 +- .../build_config/parts_builder.py | 9 +- .../build_config/recipe_builder.py | 6 +- .../configuration/anki_field.py | 13 ++ brain_brew/representation/generic/csv_file.py | 5 +- .../representation/generic/html_file.py | 33 ++++ .../representation/yaml/note_model_field.py | 86 +++++++++++ .../representation/yaml/note_model_repr.py | 145 +----------------- .../yaml/note_model_template.py | 81 ++++++++++ brain_brew/schemas/recipe.yaml | 28 +++- .../yaml/test_note_model_repr.py | 4 +- 15 files changed, 436 insertions(+), 160 deletions(-) create mode 100644 brain_brew/build_tasks/deck_parts/note_model_from_html_parts.py create mode 100644 brain_brew/build_tasks/deck_parts/note_model_template_from_html_files.py create mode 100644 brain_brew/representation/configuration/anki_field.py create mode 100644 brain_brew/representation/generic/html_file.py create mode 100644 brain_brew/representation/yaml/note_model_field.py create mode 100644 brain_brew/representation/yaml/note_model_template.py diff --git a/brain_brew/build_tasks/crowd_anki/crowd_anki_generate.py b/brain_brew/build_tasks/crowd_anki/crowd_anki_generate.py index 848f0d7..5243ab7 100644 --- a/brain_brew/build_tasks/crowd_anki/crowd_anki_generate.py +++ b/brain_brew/build_tasks/crowd_anki/crowd_anki_generate.py @@ -63,7 +63,7 @@ def execute(self): note_models: List[dict] = self.note_model_transform.execute() - nm_name_to_id: dict = {model.name: model.id for model in self.note_model_transform.note_models} + nm_name_to_id: dict = {model.part_id: model.part.id for model in self.note_model_transform.note_models} notes = self.notes_transform.execute(nm_name_to_id) media_files: Set[MediaFile] = set() diff --git a/brain_brew/build_tasks/crowd_anki/note_models_to_crowd_anki.py b/brain_brew/build_tasks/crowd_anki/note_models_to_crowd_anki.py index 927e3a2..344f632 100644 --- a/brain_brew/build_tasks/crowd_anki/note_models_to_crowd_anki.py +++ b/brain_brew/build_tasks/crowd_anki/note_models_to_crowd_anki.py @@ -55,11 +55,11 @@ def from_repr(cls, data: Union[Representation, dict, str]): part_to_read=rep.part_id ) - def get_note_model(self) -> NoteModel: - self.part = PartHolder.from_file_manager(self.part_to_read).part + def get_note_model(self) -> PartHolder[NoteModel]: + self.part = PartHolder.from_file_manager(self.part_to_read) return self.part # Todo: add filters in here - part: NoteModel = field(init=False) + part: PartHolder[NoteModel] = field(init=False) part_to_read: str @dataclass @@ -81,7 +81,7 @@ def from_repr(cls, data: Union[Representation, dict, List[str]]): note_models=[nm.get_note_model() for nm in note_model_items] ) - note_models: List[NoteModel] + note_models: List[PartHolder[NoteModel]] def execute(self) -> List[dict]: - return [model.encode_as_crowdanki() for model in self.note_models] + return [model.part.encode_as_crowdanki() for model in self.note_models] diff --git a/brain_brew/build_tasks/deck_parts/note_model_from_html_parts.py b/brain_brew/build_tasks/deck_parts/note_model_from_html_parts.py new file mode 100644 index 0000000..453d4a9 --- /dev/null +++ b/brain_brew/build_tasks/deck_parts/note_model_from_html_parts.py @@ -0,0 +1,77 @@ +from dataclasses import dataclass, field +from typing import Optional, Union, List + +from brain_brew.representation.build_config.build_task import BuildPartTask + +from brain_brew.representation.configuration.representation_base import RepresentationBase +from brain_brew.representation.generic.html_file import HTMLFile +from brain_brew.representation.yaml.note_model_repr import NoteModel +from brain_brew.representation.yaml.note_model_field import Field +from brain_brew.representation.yaml.note_model_template import Template +from brain_brew.representation.yaml.part_holder import PartHolder + + +@dataclass +class NoteModelFromHTMLParts(BuildPartTask): + @classmethod + def task_name(cls) -> str: + return r'note_model_from_html_parts' + + @classmethod + def yamale_schema(cls) -> str: + return f'''\ + part_id: str() + model_id: str() + css_file: str() + fields: list(include('{Field.task_name()}')) + templates: list(str()) + model_name: str(required=False) + save_to_file: str(required=False) + ''' + + @classmethod + def yamale_dependencies(cls) -> set: + return {Field} + + @dataclass + class Representation(RepresentationBase): + part_id: str + model_id: str + css_file: str + fields: List[dict] + templates: List[dict] + model_name: Optional[str] = field(default=None) + save_to_file: Optional[str] = field(default=None) + + @classmethod + def from_repr(cls, data: Union[Representation, dict]): + rep: cls.Representation = data if isinstance(data, cls.Representation) else cls.Representation.from_dict(data) + return cls( + part_id=rep.part_id, + model_id=rep.model_id, + css=HTMLFile.create_or_get(rep.css_file).get_data(deep_copy=True), + fields=list(map(Field.from_dict, rep.fields)), + templates=list(holder.part for holder in map(PartHolder.from_file_manager, rep.templates)), + model_name=rep.model_name or rep.part_id, + save_to_file=rep.save_to_file + ) + + part_id: str + model_id: str + css: str + fields: List[Field] + templates: List[Template] + model_name: str + save_to_file: Optional[str] + + def execute(self): + part = NoteModel( + name=self.model_name, + id=self.model_id, + css=self.css, + fields=self.fields, + templates=self.templates, + required_fields_per_template=[] + ) + + PartHolder.override_or_create(self.part_id, self.save_to_file, part) diff --git a/brain_brew/build_tasks/deck_parts/note_model_template_from_html_files.py b/brain_brew/build_tasks/deck_parts/note_model_template_from_html_files.py new file mode 100644 index 0000000..9635127 --- /dev/null +++ b/brain_brew/build_tasks/deck_parts/note_model_template_from_html_files.py @@ -0,0 +1,88 @@ +from dataclasses import dataclass, field +from typing import Optional + +from brain_brew.representation.build_config.build_task import BuildPartTask +from brain_brew.representation.configuration.representation_base import RepresentationBase +from brain_brew.representation.generic.html_file import HTMLFile +from brain_brew.representation.yaml.note_model_template import Template +from brain_brew.representation.yaml.part_holder import PartHolder + +html_separator = '--' + + +@dataclass +class TemplateFromHTML(BuildPartTask): + @classmethod + def task_name(cls) -> str: + return r'note_model_template_from_html' + + @classmethod + def task_regex(cls) -> str: + return r'note_model_template[s]?_from_html' + + @classmethod + def yamale_schema(cls) -> str: + return f"""\ + part_id: str() + html_file: str() + template_name: str(required=False) + browser_html_file: str(required=False) + deck_override_id: int(required=False) + save_to_file: str(required=False) + """ + + @dataclass + class Representation(RepresentationBase): + part_id: str + html_file: str + template_name: Optional[str] = field(default=None) + browser_html_file: Optional[str] = field(default=None) + deck_override_id: Optional[int] = field(default=None) + save_to_file: Optional[str] = field(default=None) + + @classmethod + def from_repr(cls, data: dict): + rep: cls.Representation = data if isinstance(data, cls.Representation) else cls.Representation.from_dict(data) + return cls( + part_id=rep.part_id, + template_name=rep.template_name or rep.part_id, + html_file=HTMLFile.create_or_get(rep.html_file), + browser_html_file=HTMLFile.create_or_get(rep.browser_html_file) if rep.browser_html_file else None, + deck_override_id=rep.deck_override_id, + save_to_file=rep.save_to_file + ) + + part_id: str + template_name: str + html_file: HTMLFile + browser_html_file: Optional[HTMLFile] + deck_override_id: Optional[int] + save_to_file: Optional[str] + + def execute(self): + main_data = self.html_file.get_data(deep_copy=True) + browser_data = self.browser_html_file.get_data(deep_copy=True) if self.browser_html_file else None + + if html_separator not in main_data: + raise ValueError(f"Cannot find separator {html_separator} in html file '{self.html_file.file_location}'") + + front, back = tuple(main_data.split(html_separator, maxsplit=1)) + + if browser_data: + if html_separator not in browser_data: + raise ValueError(f"Cannot find separator {html_separator} in html file '{self.browser_html_file.file_location}'") + + browser_front, browser_back = tuple(browser_data.split(html_separator, maxsplit=1)) + else: + browser_front = browser_back = None + + template = Template( + name=self.template_name, + question_format=front, + answer_format=back, + question_format_in_browser=browser_front, + answer_format_in_browser=browser_back, + deck_override_id=self.deck_override_id + ) + + PartHolder.override_or_create(self.part_id, self.save_to_file, template) diff --git a/brain_brew/representation/build_config/build_task.py b/brain_brew/representation/build_config/build_task.py index 8cbd1e4..48cde25 100644 --- a/brain_brew/representation/build_config/build_task.py +++ b/brain_brew/representation/build_config/build_task.py @@ -5,14 +5,13 @@ class BuildTask(YamlRepr, object, metaclass=ABCMeta): + execute_immediately: bool = False + accepts_list_of_self: bool = True + @abstractmethod def execute(self): pass - @classmethod - def accepts_list(cls) -> bool: - return True - @classmethod def task_regex(cls) -> str: return cls.task_name() @@ -38,4 +37,4 @@ class TopLevelBuildTask(BuildTask, metaclass=ABCMeta): class BuildPartTask(BuildTask, metaclass=ABCMeta): - pass + execute_immediately: bool = True diff --git a/brain_brew/representation/build_config/parts_builder.py b/brain_brew/representation/build_config/parts_builder.py index 36fb657..074ef43 100644 --- a/brain_brew/representation/build_config/parts_builder.py +++ b/brain_brew/representation/build_config/parts_builder.py @@ -13,6 +13,8 @@ from brain_brew.build_tasks.crowd_anki.note_models_from_crowd_anki import NoteModelsFromCrowdAnki from brain_brew.build_tasks.crowd_anki.notes_from_crowd_anki import NotesFromCrowdAnki from brain_brew.build_tasks.deck_parts.media_group_to_folder import MediaGroupsToFolder +from brain_brew.build_tasks.deck_parts.note_model_from_html_parts import NoteModelFromHTMLParts +from brain_brew.build_tasks.deck_parts.note_model_template_from_html_files import TemplateFromHTML from brain_brew.representation.build_config.build_task import BuildTask, BuildPartTask, TopLevelBuildTask from brain_brew.representation.build_config.recipe_builder import RecipeBuilder @@ -20,14 +22,12 @@ @dataclass class PartsBuilder(RecipeBuilder, TopLevelBuildTask): + accepts_list_of_self: bool = False + @classmethod def task_name(cls) -> str: return r'build_parts' - @classmethod - def accepts_list(cls) -> bool: - return False - @classmethod def task_regex(cls) -> str: return r'build_part[s]?' @@ -59,5 +59,6 @@ def yamale_dependencies(cls) -> Set[Type[BuildPartTask]]: NotesFromCsvs, NotesFromYamlPart, HeadersFromYamlPart, NoteModelsFromYamlPart, MediaGroupFromYamlPart, MediaGroupFromFolder, MediaGroupsToFolder, + NoteModelFromHTMLParts, TemplateFromHTML, HeadersFromCrowdAnki, MediaGroupFromCrowdAnki, NoteModelsFromCrowdAnki, NotesFromCrowdAnki } diff --git a/brain_brew/representation/build_config/recipe_builder.py b/brain_brew/representation/build_config/recipe_builder.py index 9c9a176..94bb44c 100644 --- a/brain_brew/representation/build_config/recipe_builder.py +++ b/brain_brew/representation/build_config/recipe_builder.py @@ -29,7 +29,7 @@ def build_yamale_root_node(cls, subclasses: Set[Type['BuildTask']]) -> str: task_list = [] for c in sorted(subclasses, key=lambda x: x.task_name()): task_command = f"any(include('{c.task_name()}'), list(include('{c.task_name()}')))"\ - if c.accepts_list() else f"include('{c.task_name()}')" + if c.accepts_list_of_self else f"include('{c.task_name()}')" task_list.append(f"map({task_command}, key=regex('{c.task_regex()}', ignore_case=True))") final_tasks: str = "list(\n" + indent(",\n".join(task_list), ' ') + "\n)\n" @@ -59,13 +59,15 @@ def find_matching_task(task_n): matching_task = find_matching_task(task_name) if matching_task is not None: - if matching_task.accepts_list() and isinstance(task_arguments, list): + if matching_task.accepts_list_of_self and isinstance(task_arguments, list): task_or_tasks = [matching_task.from_repr(t_arg) for t_arg in task_arguments] else: task_or_tasks = [matching_task.from_repr(task_arguments)] for inner_task in task_or_tasks: build_tasks.append(inner_task) + if inner_task.execute_immediately: + inner_task.execute() else: raise KeyError(f"Unknown task '{task_name}'") # TODO: check this first on all and return all errors diff --git a/brain_brew/representation/configuration/anki_field.py b/brain_brew/representation/configuration/anki_field.py new file mode 100644 index 0000000..54d147d --- /dev/null +++ b/brain_brew/representation/configuration/anki_field.py @@ -0,0 +1,13 @@ +class AnkiField: + name: str + anki_name: str + default_value: any + + def __init__(self, anki_name, name=None, default_value=None): + self.anki_name = anki_name + self.name = name if name is not None else anki_name + self.default_value = default_value + + def append_name_if_differs(self, dict_to_add_to: dict, value): + if value != self.default_value: + dict_to_add_to.setdefault(self.name, value) diff --git a/brain_brew/representation/generic/csv_file.py b/brain_brew/representation/generic/csv_file.py index cdcf019..7adafbf 100644 --- a/brain_brew/representation/generic/csv_file.py +++ b/brain_brew/representation/generic/csv_file.py @@ -1,6 +1,5 @@ import csv import logging -import re from enum import Enum from typing import List @@ -20,7 +19,6 @@ class CsvFile(SourceFile): def __init__(self, file): self.file_location = file - self.read_file() @classmethod @@ -72,8 +70,7 @@ def get_data(self, deep_copy=False) -> List[dict]: @staticmethod def to_filename_csv(filename: str) -> str: - converted = re.sub(r'\s+', '-', filename).strip() - return converted + ".csv" if not converted.endswith(".csv") else converted + return filename + ".csv" if not filename.endswith(".csv") else filename @classmethod def formatted_file_location(cls, location): diff --git a/brain_brew/representation/generic/html_file.py b/brain_brew/representation/generic/html_file.py new file mode 100644 index 0000000..96b6111 --- /dev/null +++ b/brain_brew/representation/generic/html_file.py @@ -0,0 +1,33 @@ +from dataclasses import dataclass +import codecs + +from brain_brew.representation.generic.source_file import SourceFile + + +@dataclass +class HTMLFile(SourceFile): + file_location: str + _data: str + + def __init__(self, file): + self.file_location = file + self.read_file() + + @classmethod + def from_file_loc(cls, file_loc) -> 'HTMLFile': + return cls(file_loc) + + def read_file(self): + r = codecs.open(self.file_location, 'r') + self._data = r.read() + + def get_data(self, deep_copy=False) -> str: + return self.get_deep_copy(self._data) if deep_copy else self._data + + @staticmethod + def to_filename_html(filename: str) -> str: + return filename + ".csv" if not filename.endswith(".csv") else filename + + @classmethod + def formatted_file_location(cls, location): + return cls.to_filename_html(location) diff --git a/brain_brew/representation/yaml/note_model_field.py b/brain_brew/representation/yaml/note_model_field.py new file mode 100644 index 0000000..f83e5a9 --- /dev/null +++ b/brain_brew/representation/yaml/note_model_field.py @@ -0,0 +1,86 @@ +from dataclasses import dataclass, field +from typing import List, Union + +from brain_brew.interfaces.yamale_verifyable import YamlRepr +from brain_brew.representation.configuration.anki_field import AnkiField +from brain_brew.representation.configuration.representation_base import RepresentationBase + +NAME = AnkiField("name") +ORDINAL = AnkiField("ord", "ordinal") +FONT = AnkiField("font", default_value="Liberation Sans") +MEDIA = AnkiField("media", default_value=[]) +IS_RIGHT_TO_LEFT = AnkiField("rtl", "is_right_to_left", default_value=False) +FONT_SIZE = AnkiField("size", "font_size", default_value=20) +IS_STICKY = AnkiField("sticky", "is_sticky", default_value=False) + + +@dataclass +class Field(RepresentationBase, YamlRepr): + @classmethod + def task_name(cls) -> str: + return r"note_model_field" + + @classmethod + def yamale_schema(cls) -> str: + return f"""\ + name: str() + font: str(required=False) + font_size: int(required=False) + is_sticky: bool(required=False) + is_right_to_left: bool(required=False) + """ + + @classmethod + def from_repr(cls, data: dict): + pass + + @dataclass + class CrowdAnki(RepresentationBase): + name: str + ord: int = field(default=None) + font: str = field(default=FONT.default_value) + media: List[str] = field(default_factory=lambda: MEDIA.default_value) + rtl: bool = field(default=IS_RIGHT_TO_LEFT.default_value) + size: int = field(default=FONT_SIZE.default_value) + sticky: bool = field(default=IS_STICKY.default_value) + + name: str + font: str = field(default=FONT.default_value) + is_right_to_left: bool = field(default=IS_RIGHT_TO_LEFT.default_value) + font_size: int = field(default=FONT_SIZE.default_value) + is_sticky: bool = field(default=IS_STICKY.default_value) + media: List[str] = field(default_factory=lambda: MEDIA.default_value) # Unused in Anki + + @classmethod + def from_crowd_anki(cls, data: Union[CrowdAnki, dict]): + ca: cls.CrowdAnki = data if isinstance(data, cls.CrowdAnki) else cls.CrowdAnki.from_dict(data) + return cls( + name=ca.name, font=ca.font, media=ca.media, + is_right_to_left=ca.rtl, font_size=ca.size, is_sticky=ca.sticky + ) + + def encode_as_crowdanki(self, ordinal: int) -> dict: + data_dict = { + FONT.anki_name: self.font, + MEDIA.anki_name: self.media, + NAME.anki_name: self.name, + ORDINAL.anki_name: ordinal, + IS_RIGHT_TO_LEFT.anki_name: self.is_right_to_left, + FONT_SIZE.anki_name: self.font_size, + IS_STICKY.anki_name: self.is_sticky + } + + return data_dict + + def encode_as_part(self) -> dict: + data_dict = { + NAME.name: self.name + } + + FONT.append_name_if_differs(data_dict, self.font) + MEDIA.append_name_if_differs(data_dict, self.media) + IS_RIGHT_TO_LEFT.append_name_if_differs(data_dict, self.is_right_to_left) + FONT_SIZE.append_name_if_differs(data_dict, self.font_size) + IS_STICKY.append_name_if_differs(data_dict, self.is_sticky) + + return data_dict diff --git a/brain_brew/representation/yaml/note_model_repr.py b/brain_brew/representation/yaml/note_model_repr.py index 089905e..0218d63 100644 --- a/brain_brew/representation/yaml/note_model_repr.py +++ b/brain_brew/representation/yaml/note_model_repr.py @@ -1,27 +1,14 @@ from collections import OrderedDict from dataclasses import dataclass, field -from typing import List, Optional, Union, Dict, Set +from typing import List, Union, Dict, Set from brain_brew.interfaces.media_container import MediaContainer +from brain_brew.representation.configuration.anki_field import AnkiField from brain_brew.representation.configuration.representation_base import RepresentationBase +from brain_brew.representation.yaml.note_model_field import Field +from brain_brew.representation.yaml.note_model_template import Template from brain_brew.representation.yaml.yaml_object import YamlObject -from brain_brew.utils import list_of_str_to_lowercase, find_media_in_field - - -class AnkiField: - name: str - anki_name: str - default_value: any - - def __init__(self, anki_name, name=None, default_value=None): - self.anki_name = anki_name - self.name = name if name is not None else anki_name - self.default_value = default_value - - def append_name_if_differs(self, dict_to_add_to: dict, value): - if value != self.default_value: - dict_to_add_to.setdefault(self.name, value) - +from brain_brew.utils import list_of_str_to_lowercase # CrowdAnki CROWDANKI_ID = AnkiField("crowdanki_uuid", "id") @@ -61,122 +48,6 @@ def append_name_if_differs(self, dict_to_add_to: dict, value): DECK_OVERRIDE_ID = AnkiField("did", "deck_override_id", default_value=None) -@dataclass -class Template(RepresentationBase): - @dataclass - class CrowdAnki(RepresentationBase): - name: str - qfmt: str - afmt: str - bqfmt: str = field(default=BROWSER_QUESTION_FORMAT.default_value) - bafmt: str = field(default=BROWSER_ANSWER_FORMAT.default_value) - ord: int = field(default=None) - did: Optional[int] = field(default=None) - - name: str - question_format: str - answer_format: str - question_format_in_browser: str = field(default=BROWSER_QUESTION_FORMAT.default_value) - answer_format_in_browser: str = field(default=BROWSER_ANSWER_FORMAT.default_value) - deck_override_id: Optional[int] = field(default=DECK_OVERRIDE_ID.default_value) - - @classmethod - def from_crowdanki(cls, data: Union[CrowdAnki, dict]): - ca: cls.CrowdAnki = data if isinstance(data, cls.CrowdAnki) else cls.CrowdAnki.from_dict(data) - return cls( - name=ca.name, question_format=ca.qfmt, answer_format=ca.afmt, - question_format_in_browser=ca.bqfmt, answer_format_in_browser=ca.bafmt, deck_override_id=ca.did - ) - - def get_all_media_references(self) -> Set[str]: - all_media = set()\ - .union(find_media_in_field(self.question_format))\ - .union(find_media_in_field(self.answer_format))\ - .union(find_media_in_field(self.question_format_in_browser))\ - .union(find_media_in_field(self.answer_format_in_browser)) - return all_media - - def encode_as_crowdanki(self, ordinal: int) -> dict: - data_dict = { - ANSWER_FORMAT.anki_name: self.answer_format, - BROWSER_ANSWER_FORMAT.anki_name: self.answer_format_in_browser, - BROWSER_QUESTION_FORMAT.anki_name: self.question_format_in_browser, - DECK_OVERRIDE_ID.anki_name: self.deck_override_id, - NAME.anki_name: self.name, - ORDINAL.anki_name: ordinal, - QUESTION_FORMAT.anki_name: self.question_format, - } - - return data_dict - - def encode_as_part(self) -> dict: - data_dict = { - NAME.name: self.name, - QUESTION_FORMAT.name: self.question_format, - ANSWER_FORMAT.name: self.answer_format - } - - BROWSER_QUESTION_FORMAT.append_name_if_differs(data_dict, self.question_format_in_browser) - BROWSER_ANSWER_FORMAT.append_name_if_differs(data_dict, self.answer_format_in_browser) - DECK_OVERRIDE_ID.append_name_if_differs(data_dict, self.deck_override_id) - - return data_dict - - -@dataclass -class Field(RepresentationBase): - @dataclass - class CrowdAnki(RepresentationBase): - name: str - ord: int = field(default=None) - font: str = field(default=FONT.default_value) - media: List[str] = field(default_factory=lambda: MEDIA.default_value) - rtl: bool = field(default=IS_RIGHT_TO_LEFT.default_value) - size: int = field(default=FONT_SIZE.default_value) - sticky: bool = field(default=IS_STICKY.default_value) - - name: str - font: str = field(default=FONT.default_value) - media: List[str] = field(default_factory=lambda: MEDIA.default_value) # Unused in Anki - is_right_to_left: bool = field(default=IS_RIGHT_TO_LEFT.default_value) - font_size: int = field(default=FONT_SIZE.default_value) - is_sticky: bool = field(default=IS_STICKY.default_value) - - @classmethod - def from_crowd_anki(cls, data: Union[CrowdAnki, dict]): - ca: cls.CrowdAnki = data if isinstance(data, cls.CrowdAnki) else cls.CrowdAnki.from_dict(data) - return cls( - name=ca.name, font=ca.font, media=ca.media, - is_right_to_left=ca.rtl, font_size=ca.size, is_sticky=ca.sticky - ) - - def encode_as_crowdanki(self, ordinal: int) -> dict: - data_dict = { - FONT.anki_name: self.font, - MEDIA.anki_name: self.media, - NAME.anki_name: self.name, - ORDINAL.anki_name: ordinal, - IS_RIGHT_TO_LEFT.anki_name: self.is_right_to_left, - FONT_SIZE.anki_name: self.font_size, - IS_STICKY.anki_name: self.is_sticky - } - - return data_dict - - def encode_as_part(self) -> dict: - data_dict = { - NAME.name: self.name - } - - FONT.append_name_if_differs(data_dict, self.font) - MEDIA.append_name_if_differs(data_dict, self.media) - IS_RIGHT_TO_LEFT.append_name_if_differs(data_dict, self.is_right_to_left) - FONT_SIZE.append_name_if_differs(data_dict, self.font_size) - IS_STICKY.append_name_if_differs(data_dict, self.is_sticky) - - return data_dict - - @dataclass class NoteModel(YamlObject, MediaContainer, RepresentationBase): @dataclass @@ -214,8 +85,8 @@ class CrowdAnki(RepresentationBase): def from_yaml_file(cls, filename: str): data = cls.read_to_dict(filename) return cls( - fields=[Field(**f) for f in data.pop(FIELDS.name)], - templates=[Template(**t) for t in data.pop(TEMPLATES.name)], + fields=[Field.from_dict(f) for f in data.pop(FIELDS.name)], + templates=[Template.from_dict(t) for t in data.pop(TEMPLATES.name)], **data ) @@ -264,7 +135,7 @@ def encode(self) -> dict: LATEX_POST.append_name_if_differs(data_dict, self.latex_post) data_dict.setdefault(FIELDS.name, [f.encode_as_part() for f in self.fields]) - data_dict.setdefault(TEMPLATES.name, [t.encode_as_part() for t in self.templates]) + data_dict.setdefault(TEMPLATES.name, [t.encode() for t in self.templates]) # Useless TAGS.append_name_if_differs(data_dict, self.tags) diff --git a/brain_brew/representation/yaml/note_model_template.py b/brain_brew/representation/yaml/note_model_template.py new file mode 100644 index 0000000..7c5af8e --- /dev/null +++ b/brain_brew/representation/yaml/note_model_template.py @@ -0,0 +1,81 @@ +from dataclasses import dataclass, field +from typing import Optional, Union, Set + +from brain_brew.representation.configuration.anki_field import AnkiField +from brain_brew.representation.configuration.representation_base import RepresentationBase +from brain_brew.representation.yaml.yaml_object import YamlObject +from brain_brew.utils import find_media_in_field + +NAME = AnkiField("name") +ORDINAL = AnkiField("ord", "ordinal") +QUESTION_FORMAT = AnkiField("qfmt", "question_format") +ANSWER_FORMAT = AnkiField("afmt", "answer_format") +BROWSER_ANSWER_FORMAT = AnkiField("bafmt", "browser_answer_format", default_value="") +BROWSER_QUESTION_FORMAT = AnkiField("bqfmt", "browser_question_format", default_value="") +DECK_OVERRIDE_ID = AnkiField("did", "deck_override_id", default_value=None) + + +@dataclass +class Template(RepresentationBase, YamlObject): + @classmethod + def from_yaml_file(cls, filename: str) -> 'Template': + return cls.from_dict(cls.read_to_dict(filename)) + + @dataclass + class CrowdAnki(RepresentationBase): + name: str + qfmt: str + afmt: str + bqfmt: str = field(default=BROWSER_QUESTION_FORMAT.default_value) + bafmt: str = field(default=BROWSER_ANSWER_FORMAT.default_value) + ord: int = field(default=None) + did: Optional[int] = field(default=None) + + name: str + question_format: str + answer_format: str + question_format_in_browser: str = field(default=BROWSER_QUESTION_FORMAT.default_value) + answer_format_in_browser: str = field(default=BROWSER_ANSWER_FORMAT.default_value) + deck_override_id: Optional[int] = field(default=DECK_OVERRIDE_ID.default_value) + + @classmethod + def from_crowdanki(cls, data: Union[CrowdAnki, dict]): + ca: cls.CrowdAnki = data if isinstance(data, cls.CrowdAnki) else cls.CrowdAnki.from_dict(data) + return cls( + name=ca.name, question_format=ca.qfmt, answer_format=ca.afmt, + question_format_in_browser=ca.bqfmt, answer_format_in_browser=ca.bafmt, deck_override_id=ca.did + ) + + def get_all_media_references(self) -> Set[str]: + all_media = set()\ + .union(find_media_in_field(self.question_format))\ + .union(find_media_in_field(self.answer_format))\ + .union(find_media_in_field(self.question_format_in_browser))\ + .union(find_media_in_field(self.answer_format_in_browser)) + return all_media + + def encode_as_crowdanki(self, ordinal: int) -> dict: + data_dict = { + ANSWER_FORMAT.anki_name: self.answer_format, + BROWSER_ANSWER_FORMAT.anki_name: self.answer_format_in_browser, + BROWSER_QUESTION_FORMAT.anki_name: self.question_format_in_browser, + DECK_OVERRIDE_ID.anki_name: self.deck_override_id, + NAME.anki_name: self.name, + ORDINAL.anki_name: ordinal, + QUESTION_FORMAT.anki_name: self.question_format, + } + + return data_dict + + def encode(self) -> dict: + data_dict = { + NAME.name: self.name, + QUESTION_FORMAT.name: self.question_format, + ANSWER_FORMAT.name: self.answer_format + } + + BROWSER_QUESTION_FORMAT.append_name_if_differs(data_dict, self.question_format_in_browser) + BROWSER_ANSWER_FORMAT.append_name_if_differs(data_dict, self.answer_format_in_browser) + DECK_OVERRIDE_ID.append_name_if_differs(data_dict, self.deck_override_id) + + return data_dict diff --git a/brain_brew/schemas/recipe.yaml b/brain_brew/schemas/recipe.yaml index db838f6..a67144d 100644 --- a/brain_brew/schemas/recipe.yaml +++ b/brain_brew/schemas/recipe.yaml @@ -1,5 +1,5 @@ list( - map(include('build_parts'), key=regex('build_part[s]?', ignore_case=True)), + map(any(include('build_parts'), list(include('build_parts'))), key=regex('build_part[s]?', ignore_case=True)), map(any(include('generate_crowd_anki'), list(include('generate_crowd_anki'))), key=regex('generate_crowd_anki', ignore_case=True)), map(any(include('generate_csvs'), list(include('generate_csvs'))), key=regex('generate_csv[s]?', ignore_case=True)) ) @@ -14,6 +14,8 @@ build_parts: map(any(include('media_group_from_crowd_anki'), list(include('media_group_from_crowd_anki'))), key=regex('media_group_from_crowd_anki', ignore_case=True)), map(any(include('media_group_from_folder'), list(include('media_group_from_folder'))), key=regex('media_group_from_folder', ignore_case=True)), map(any(include('media_group_from_yaml_part'), list(include('media_group_from_yaml_part'))), key=regex('media_group_from_yaml_part', ignore_case=True)), + map(any(include('note_model_from_html_parts'), list(include('note_model_from_html_parts'))), key=regex('note_model_from_html_parts', ignore_case=True)), + map(any(include('note_model_template_from_html'), list(include('note_model_template_from_html'))), key=regex('note_model_template[s]?_from_html', ignore_case=True)), map(any(include('note_models_from_crowd_anki'), list(include('note_models_from_crowd_anki'))), key=regex('note_model[s]?_from_crowd_anki', ignore_case=True)), map(any(include('note_models_from_yaml_part'), list(include('note_models_from_yaml_part'))), key=regex('note_model[s]?_from_yaml_part', ignore_case=True)), map(any(include('notes_from_crowd_anki'), list(include('notes_from_crowd_anki'))), key=regex('notes_from_crowd_anki', ignore_case=True)), @@ -76,11 +78,35 @@ media_group_from_yaml_part: media_group_to_crowd_anki: parts: list(str()) +note_model_field: + name: str() + font: str(required=False) + font_size: int(required=False) + is_sticky: bool(required=False) + is_right_to_left: bool(required=False) + +note_model_from_html_parts: + part_id: str() + model_id: str() + css_file: str() + fields: list(include('note_model_field')) + templates: list(str()) + model_name: str(required=False) + save_to_file: str(required=False) + note_model_mapping: note_models: any(list(str()), str()) columns_to_fields: map(str(), key=str()) personal_fields: list(str()) +note_model_template_from_html: + part_id: str() + html_file: str() + template_name: str(required=False) + browser_html_file: str(required=False) + deck_override_id: int(required=False) + save_to_file: str(required=False) + note_models_from_crowd_anki: source: str() part_id: str() diff --git a/tests/representation/yaml/test_note_model_repr.py b/tests/representation/yaml/test_note_model_repr.py index e462a8f..45ddcd0 100644 --- a/tests/representation/yaml/test_note_model_repr.py +++ b/tests/representation/yaml/test_note_model_repr.py @@ -1,6 +1,8 @@ import pytest -from brain_brew.representation.yaml.note_model_repr import NoteModel, Template, Field +from brain_brew.representation.yaml.note_model_repr import NoteModel +from brain_brew.representation.yaml.note_model_field import Field +from brain_brew.representation.yaml.note_model_template import Template from brain_brew.representation.json.json_file import JsonFile from brain_brew.representation.yaml.yaml_object import YamlObject from tests.test_files import TestFiles From adc99cc8d787ce66783f8f0f27e689c5bc96d278 Mon Sep 17 00:00:00 2001 From: Jordan Munch O'Hare Date: Sun, 29 Nov 2020 11:29:25 +0100 Subject: [PATCH 2/3] Recipe update --- brain_brew/schemas/recipe.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brain_brew/schemas/recipe.yaml b/brain_brew/schemas/recipe.yaml index a67144d..b50170c 100644 --- a/brain_brew/schemas/recipe.yaml +++ b/brain_brew/schemas/recipe.yaml @@ -1,5 +1,5 @@ list( - map(any(include('build_parts'), list(include('build_parts'))), key=regex('build_part[s]?', ignore_case=True)), + map(include('build_parts'), key=regex('build_part[s]?', ignore_case=True)), map(any(include('generate_crowd_anki'), list(include('generate_crowd_anki'))), key=regex('generate_crowd_anki', ignore_case=True)), map(any(include('generate_csvs'), list(include('generate_csvs'))), key=regex('generate_csv[s]?', ignore_case=True)) ) From 33f6fd942f3c0ea57afad217b03d480d4a8dc8a2 Mon Sep 17 00:00:00 2001 From: Jordan Munch O'Hare Date: Thu, 3 Dec 2020 08:35:17 +0100 Subject: [PATCH 3/3] Refactor Imports and Project Structure --- .../crowd_anki/crowd_anki_generate.py | 4 ++-- .../crowd_anki/headers_from_crowdanki.py | 8 ++++---- .../crowd_anki/headers_to_crowd_anki.py | 6 +++--- .../crowd_anki/media_group_from_crowd_anki.py | 4 ++-- .../crowd_anki/media_to_crowd_anki.py | 6 +++--- .../crowd_anki/note_models_from_crowd_anki.py | 9 ++++----- .../crowd_anki/note_models_to_crowd_anki.py | 6 +++--- .../crowd_anki/notes_from_crowd_anki.py | 8 ++++---- .../crowd_anki/notes_to_crowd_anki.py | 6 +++--- brain_brew/build_tasks/csvs/csvs_generate.py | 10 +++++----- brain_brew/build_tasks/csvs/notes_from_csvs.py | 10 +++++----- .../build_tasks/csvs/shared_base_csvs.py | 6 +++--- .../build_tasks/deck_parts/from_yaml_part.py | 14 +++++++------- .../deck_parts/media_group_from_folder.py | 8 ++++---- .../deck_parts/media_group_to_folder.py | 8 ++++---- .../deck_parts/note_model_from_html_parts.py | 9 ++++----- .../note_model_template_from_html_files.py | 6 +++--- .../build_config => configuration}/__init__.py | 0 .../configuration/anki_field.py | 0 .../{ => configuration}/argument_reader.py | 0 .../build_config}/__init__.py | 0 .../build_config/build_task.py | 2 +- .../build_config/parts_builder.py | 18 +++++++----------- .../build_config/recipe_builder.py | 4 ++-- .../build_config/top_level_builder.py | 13 +++++-------- brain_brew/{ => configuration}/file_manager.py | 2 +- .../configuration/global_config.py | 2 +- .../yaml => configuration}/part_holder.py | 2 +- .../configuration/representation_base.py | 0 .../{ => configuration}/yaml_verifier.py | 2 +- brain_brew/main.py | 10 +++++----- brain_brew/representation/generic/html_file.py | 2 +- .../representation/generic/source_file.py | 2 +- .../representation/json/crowd_anki_export.py | 2 +- .../yaml/{headers_repr.py => headers.py} | 0 .../{media_group_repr.py => media_group.py} | 0 .../yaml/{note_model_repr.py => note_model.py} | 4 ++-- .../representation/yaml/note_model_field.py | 4 ++-- .../representation/yaml/note_model_template.py | 4 ++-- .../yaml/{note_repr.py => notes.py} | 2 +- .../file_mapping.py} | 2 +- .../transformers/media_group_from_location.py | 4 ++-- .../media_group_save_to_location.py | 2 +- .../note_model_mapping.py | 8 ++++---- brain_brew/utils.py | 4 ++-- scripts/yamale_build.py | 5 +++-- .../configuration/test_csv_file_mapping.py | 14 -------------- .../representation/generic/test_media_file.py | 4 ---- .../yaml/test_note_model_repr.py | 5 ++--- tests/representation/yaml/test_note_repr.py | 6 +----- tests/test_argument_reader.py | 2 +- tests/test_file_manager.py | 4 +--- tests/test_helpers.py | 2 +- tests/test_utils.py | 2 +- 54 files changed, 117 insertions(+), 150 deletions(-) rename brain_brew/{representation/build_config => configuration}/__init__.py (100%) rename brain_brew/{representation => }/configuration/anki_field.py (100%) rename brain_brew/{ => configuration}/argument_reader.py (100%) rename brain_brew/{representation/configuration => configuration/build_config}/__init__.py (100%) rename brain_brew/{representation => configuration}/build_config/build_task.py (96%) rename brain_brew/{representation => configuration}/build_config/parts_builder.py (88%) rename brain_brew/{representation => configuration}/build_config/recipe_builder.py (96%) rename brain_brew/{representation => configuration}/build_config/top_level_builder.py (85%) rename brain_brew/{ => configuration}/file_manager.py (96%) rename brain_brew/{representation => }/configuration/global_config.py (93%) rename brain_brew/{representation/yaml => configuration}/part_holder.py (93%) rename brain_brew/{representation => }/configuration/representation_base.py (100%) rename brain_brew/{ => configuration}/yaml_verifier.py (93%) rename brain_brew/representation/yaml/{headers_repr.py => headers.py} (100%) rename brain_brew/representation/yaml/{media_group_repr.py => media_group.py} (100%) rename brain_brew/representation/yaml/{note_model_repr.py => note_model.py} (97%) rename brain_brew/representation/yaml/{note_repr.py => notes.py} (98%) rename brain_brew/{representation/configuration/csv_file_mapping.py => transformers/file_mapping.py} (98%) rename brain_brew/{representation/configuration => transformers}/note_model_mapping.py (95%) diff --git a/brain_brew/build_tasks/crowd_anki/crowd_anki_generate.py b/brain_brew/build_tasks/crowd_anki/crowd_anki_generate.py index 5243ab7..53d13bd 100644 --- a/brain_brew/build_tasks/crowd_anki/crowd_anki_generate.py +++ b/brain_brew/build_tasks/crowd_anki/crowd_anki_generate.py @@ -5,8 +5,8 @@ from brain_brew.build_tasks.crowd_anki.media_to_crowd_anki import MediaGroupToCrowdAnki from brain_brew.build_tasks.crowd_anki.note_models_to_crowd_anki import NoteModelsToCrowdAnki from brain_brew.build_tasks.crowd_anki.notes_to_crowd_anki import NotesToCrowdAnki -from brain_brew.representation.build_config.build_task import TopLevelBuildTask -from brain_brew.representation.configuration.representation_base import RepresentationBase +from brain_brew.configuration.build_config.build_task import TopLevelBuildTask +from brain_brew.configuration.representation_base import RepresentationBase from brain_brew.representation.generic.media_file import MediaFile from brain_brew.representation.json.crowd_anki_export import CrowdAnkiExport from brain_brew.representation.json.wrappers_for_crowd_anki import CrowdAnkiJsonWrapper diff --git a/brain_brew/build_tasks/crowd_anki/headers_from_crowdanki.py b/brain_brew/build_tasks/crowd_anki/headers_from_crowdanki.py index 9b08371..9cbc417 100644 --- a/brain_brew/build_tasks/crowd_anki/headers_from_crowdanki.py +++ b/brain_brew/build_tasks/crowd_anki/headers_from_crowdanki.py @@ -1,14 +1,14 @@ from dataclasses import dataclass, field from typing import Union, Optional -from brain_brew.representation.build_config.build_task import BuildPartTask -from brain_brew.representation.configuration.representation_base import RepresentationBase +from brain_brew.configuration.build_config.build_task import BuildPartTask +from brain_brew.configuration.part_holder import PartHolder +from brain_brew.configuration.representation_base import RepresentationBase from brain_brew.representation.json.crowd_anki_export import CrowdAnkiExport from brain_brew.representation.json.wrappers_for_crowd_anki import CA_NOTE_MODELS, CA_NOTES, CA_MEDIA_FILES, \ CA_CHILDREN, CA_TYPE from brain_brew.representation.json.wrappers_for_crowd_anki import CrowdAnkiJsonWrapper -from brain_brew.representation.yaml.headers_repr import Headers -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.representation.yaml.headers import Headers headers_skip_keys = [CA_NOTE_MODELS, CA_NOTES, CA_MEDIA_FILES] headers_default_values = { diff --git a/brain_brew/build_tasks/crowd_anki/headers_to_crowd_anki.py b/brain_brew/build_tasks/crowd_anki/headers_to_crowd_anki.py index 9d08f61..af2f75e 100644 --- a/brain_brew/build_tasks/crowd_anki/headers_to_crowd_anki.py +++ b/brain_brew/build_tasks/crowd_anki/headers_to_crowd_anki.py @@ -2,9 +2,9 @@ from typing import Union from brain_brew.build_tasks.crowd_anki.headers_from_crowdanki import headers_default_values -from brain_brew.representation.configuration.representation_base import RepresentationBase -from brain_brew.representation.yaml.headers_repr import Headers -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.configuration.part_holder import PartHolder +from brain_brew.configuration.representation_base import RepresentationBase +from brain_brew.representation.yaml.headers import Headers @dataclass diff --git a/brain_brew/build_tasks/crowd_anki/media_group_from_crowd_anki.py b/brain_brew/build_tasks/crowd_anki/media_group_from_crowd_anki.py index e1cd77e..1d045a2 100644 --- a/brain_brew/build_tasks/crowd_anki/media_group_from_crowd_anki.py +++ b/brain_brew/build_tasks/crowd_anki/media_group_from_crowd_anki.py @@ -2,9 +2,9 @@ from typing import Union from brain_brew.build_tasks.deck_parts.media_group_from_folder import MediaGroupFromFolder +from brain_brew.configuration.part_holder import PartHolder from brain_brew.representation.json.crowd_anki_export import CrowdAnkiExport -from brain_brew.representation.yaml.media_group_repr import MediaGroup -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.representation.yaml.media_group import MediaGroup from brain_brew.transformers.media_group_from_location import create_media_group_from_location diff --git a/brain_brew/build_tasks/crowd_anki/media_to_crowd_anki.py b/brain_brew/build_tasks/crowd_anki/media_to_crowd_anki.py index 617c16f..222ddfe 100644 --- a/brain_brew/build_tasks/crowd_anki/media_to_crowd_anki.py +++ b/brain_brew/build_tasks/crowd_anki/media_to_crowd_anki.py @@ -1,11 +1,11 @@ from dataclasses import dataclass from typing import Union, List, Set +from brain_brew.configuration.part_holder import PartHolder +from brain_brew.configuration.representation_base import RepresentationBase from brain_brew.interfaces.yamale_verifyable import YamlRepr -from brain_brew.representation.configuration.representation_base import RepresentationBase from brain_brew.representation.generic.media_file import MediaFile -from brain_brew.representation.yaml.media_group_repr import MediaGroup -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.representation.yaml.media_group import MediaGroup from brain_brew.transformers.media_group_save_to_location import save_media_groups_to_location diff --git a/brain_brew/build_tasks/crowd_anki/note_models_from_crowd_anki.py b/brain_brew/build_tasks/crowd_anki/note_models_from_crowd_anki.py index 842b940..a25048b 100644 --- a/brain_brew/build_tasks/crowd_anki/note_models_from_crowd_anki.py +++ b/brain_brew/build_tasks/crowd_anki/note_models_from_crowd_anki.py @@ -1,13 +1,12 @@ from dataclasses import dataclass, field from typing import Optional, Union -from brain_brew.representation.build_config.build_task import BuildPartTask - -from brain_brew.representation.configuration.representation_base import RepresentationBase +from brain_brew.configuration.build_config.build_task import BuildPartTask +from brain_brew.configuration.part_holder import PartHolder +from brain_brew.configuration.representation_base import RepresentationBase from brain_brew.representation.json.crowd_anki_export import CrowdAnkiExport from brain_brew.representation.json.wrappers_for_crowd_anki import CrowdAnkiJsonWrapper -from brain_brew.representation.yaml.note_model_repr import NoteModel -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.representation.yaml.note_model import NoteModel @dataclass diff --git a/brain_brew/build_tasks/crowd_anki/note_models_to_crowd_anki.py b/brain_brew/build_tasks/crowd_anki/note_models_to_crowd_anki.py index 344f632..2e278ca 100644 --- a/brain_brew/build_tasks/crowd_anki/note_models_to_crowd_anki.py +++ b/brain_brew/build_tasks/crowd_anki/note_models_to_crowd_anki.py @@ -1,10 +1,10 @@ from dataclasses import dataclass, field from typing import Union, List +from brain_brew.configuration.part_holder import PartHolder +from brain_brew.configuration.representation_base import RepresentationBase from brain_brew.interfaces.yamale_verifyable import YamlRepr -from brain_brew.representation.configuration.representation_base import RepresentationBase -from brain_brew.representation.yaml.note_model_repr import NoteModel -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.representation.yaml.note_model import NoteModel @dataclass diff --git a/brain_brew/build_tasks/crowd_anki/notes_from_crowd_anki.py b/brain_brew/build_tasks/crowd_anki/notes_from_crowd_anki.py index d602b93..7430826 100644 --- a/brain_brew/build_tasks/crowd_anki/notes_from_crowd_anki.py +++ b/brain_brew/build_tasks/crowd_anki/notes_from_crowd_anki.py @@ -3,12 +3,12 @@ from typing import Union, Optional, List from brain_brew.build_tasks.crowd_anki.shared_base_notes import SharedBaseNotes -from brain_brew.representation.build_config.build_task import BuildPartTask -from brain_brew.representation.configuration.representation_base import RepresentationBase +from brain_brew.configuration.build_config.build_task import BuildPartTask +from brain_brew.configuration.part_holder import PartHolder +from brain_brew.configuration.representation_base import RepresentationBase from brain_brew.representation.json.crowd_anki_export import CrowdAnkiExport from brain_brew.representation.json.wrappers_for_crowd_anki import CrowdAnkiJsonWrapper, CrowdAnkiNoteWrapper -from brain_brew.representation.yaml.note_repr import Notes, Note -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.representation.yaml.notes import Notes, Note @dataclass diff --git a/brain_brew/build_tasks/crowd_anki/notes_to_crowd_anki.py b/brain_brew/build_tasks/crowd_anki/notes_to_crowd_anki.py index fc38f13..60cbccf 100644 --- a/brain_brew/build_tasks/crowd_anki/notes_to_crowd_anki.py +++ b/brain_brew/build_tasks/crowd_anki/notes_to_crowd_anki.py @@ -2,11 +2,11 @@ from typing import Optional, Union, List from brain_brew.build_tasks.crowd_anki.shared_base_notes import SharedBaseNotes +from brain_brew.configuration.part_holder import PartHolder +from brain_brew.configuration.representation_base import RepresentationBase from brain_brew.interfaces.yamale_verifyable import YamlRepr -from brain_brew.representation.configuration.representation_base import RepresentationBase from brain_brew.representation.json.wrappers_for_crowd_anki import CrowdAnkiNoteWrapper -from brain_brew.representation.yaml.note_repr import Notes, Note -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.representation.yaml.notes import Notes, Note from brain_brew.utils import blank_str_if_none diff --git a/brain_brew/build_tasks/csvs/csvs_generate.py b/brain_brew/build_tasks/csvs/csvs_generate.py index ad6a009..84fa30c 100644 --- a/brain_brew/build_tasks/csvs/csvs_generate.py +++ b/brain_brew/build_tasks/csvs/csvs_generate.py @@ -2,11 +2,11 @@ from typing import List, Dict, Union from brain_brew.build_tasks.csvs.shared_base_csvs import SharedBaseCsvs -from brain_brew.representation.build_config.build_task import TopLevelBuildTask -from brain_brew.representation.configuration.csv_file_mapping import FileMapping -from brain_brew.representation.configuration.note_model_mapping import NoteModelMapping -from brain_brew.representation.yaml.note_repr import Notes, Note -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.configuration.build_config.build_task import TopLevelBuildTask +from brain_brew.configuration.part_holder import PartHolder +from brain_brew.representation.yaml.notes import Notes, Note +from brain_brew.transformers.file_mapping import FileMapping +from brain_brew.transformers.note_model_mapping import NoteModelMapping from brain_brew.utils import join_tags diff --git a/brain_brew/build_tasks/csvs/notes_from_csvs.py b/brain_brew/build_tasks/csvs/notes_from_csvs.py index aefef81..9fafb78 100644 --- a/brain_brew/build_tasks/csvs/notes_from_csvs.py +++ b/brain_brew/build_tasks/csvs/notes_from_csvs.py @@ -2,11 +2,11 @@ from typing import Dict, List, Union, Optional from brain_brew.build_tasks.csvs.shared_base_csvs import SharedBaseCsvs -from brain_brew.representation.build_config.build_task import BuildPartTask -from brain_brew.representation.configuration.csv_file_mapping import FileMapping -from brain_brew.representation.configuration.note_model_mapping import NoteModelMapping -from brain_brew.representation.yaml.note_repr import Note, Notes -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.configuration.build_config.build_task import BuildPartTask +from brain_brew.configuration.part_holder import PartHolder +from brain_brew.representation.yaml.notes import Note, Notes +from brain_brew.transformers.file_mapping import FileMapping +from brain_brew.transformers.note_model_mapping import NoteModelMapping from brain_brew.utils import split_tags diff --git a/brain_brew/build_tasks/csvs/shared_base_csvs.py b/brain_brew/build_tasks/csvs/shared_base_csvs.py index ef0271e..5539ccf 100644 --- a/brain_brew/build_tasks/csvs/shared_base_csvs.py +++ b/brain_brew/build_tasks/csvs/shared_base_csvs.py @@ -2,9 +2,9 @@ from dataclasses import dataclass, field from typing import List, Dict -from brain_brew.representation.configuration.representation_base import RepresentationBase -from brain_brew.representation.configuration.csv_file_mapping import FileMapping -from brain_brew.representation.configuration.note_model_mapping import NoteModelMapping +from brain_brew.configuration.representation_base import RepresentationBase +from brain_brew.transformers.file_mapping import FileMapping +from brain_brew.transformers.note_model_mapping import NoteModelMapping @dataclass diff --git a/brain_brew/build_tasks/deck_parts/from_yaml_part.py b/brain_brew/build_tasks/deck_parts/from_yaml_part.py index 186319e..da060b4 100644 --- a/brain_brew/build_tasks/deck_parts/from_yaml_part.py +++ b/brain_brew/build_tasks/deck_parts/from_yaml_part.py @@ -2,13 +2,13 @@ from dataclasses import dataclass from typing import Union -from brain_brew.representation.build_config.build_task import BuildPartTask -from brain_brew.representation.configuration.representation_base import RepresentationBase -from brain_brew.representation.yaml.headers_repr import Headers -from brain_brew.representation.yaml.media_group_repr import MediaGroup -from brain_brew.representation.yaml.note_model_repr import NoteModel -from brain_brew.representation.yaml.note_repr import Notes -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.configuration.build_config.build_task import BuildPartTask +from brain_brew.configuration.part_holder import PartHolder +from brain_brew.configuration.representation_base import RepresentationBase +from brain_brew.representation.yaml.headers import Headers +from brain_brew.representation.yaml.media_group import MediaGroup +from brain_brew.representation.yaml.note_model import NoteModel +from brain_brew.representation.yaml.notes import Notes from brain_brew.representation.yaml.yaml_object import YamlObject diff --git a/brain_brew/build_tasks/deck_parts/media_group_from_folder.py b/brain_brew/build_tasks/deck_parts/media_group_from_folder.py index 2727cec..33915c8 100644 --- a/brain_brew/build_tasks/deck_parts/media_group_from_folder.py +++ b/brain_brew/build_tasks/deck_parts/media_group_from_folder.py @@ -1,10 +1,10 @@ from dataclasses import dataclass, field from typing import Optional, Union, List -from brain_brew.representation.build_config.build_task import BuildPartTask -from brain_brew.representation.configuration.representation_base import RepresentationBase -from brain_brew.representation.yaml.media_group_repr import MediaGroup -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.configuration.build_config.build_task import BuildPartTask +from brain_brew.configuration.part_holder import PartHolder +from brain_brew.configuration.representation_base import RepresentationBase +from brain_brew.representation.yaml.media_group import MediaGroup from brain_brew.transformers.media_group_from_location import create_media_group_from_location diff --git a/brain_brew/build_tasks/deck_parts/media_group_to_folder.py b/brain_brew/build_tasks/deck_parts/media_group_to_folder.py index e7e6202..afa4d49 100644 --- a/brain_brew/build_tasks/deck_parts/media_group_to_folder.py +++ b/brain_brew/build_tasks/deck_parts/media_group_to_folder.py @@ -1,10 +1,10 @@ from dataclasses import dataclass from typing import List, Union, Optional -from brain_brew.representation.build_config.build_task import BuildPartTask -from brain_brew.representation.configuration.representation_base import RepresentationBase -from brain_brew.representation.yaml.media_group_repr import MediaGroup -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.configuration.build_config.build_task import BuildPartTask +from brain_brew.configuration.part_holder import PartHolder +from brain_brew.configuration.representation_base import RepresentationBase +from brain_brew.representation.yaml.media_group import MediaGroup from brain_brew.transformers.media_group_save_to_location import save_media_groups_to_location diff --git a/brain_brew/build_tasks/deck_parts/note_model_from_html_parts.py b/brain_brew/build_tasks/deck_parts/note_model_from_html_parts.py index 453d4a9..18f0b38 100644 --- a/brain_brew/build_tasks/deck_parts/note_model_from_html_parts.py +++ b/brain_brew/build_tasks/deck_parts/note_model_from_html_parts.py @@ -1,14 +1,13 @@ from dataclasses import dataclass, field from typing import Optional, Union, List -from brain_brew.representation.build_config.build_task import BuildPartTask - -from brain_brew.representation.configuration.representation_base import RepresentationBase +from brain_brew.configuration.build_config.build_task import BuildPartTask +from brain_brew.configuration.part_holder import PartHolder +from brain_brew.configuration.representation_base import RepresentationBase from brain_brew.representation.generic.html_file import HTMLFile -from brain_brew.representation.yaml.note_model_repr import NoteModel +from brain_brew.representation.yaml.note_model import NoteModel from brain_brew.representation.yaml.note_model_field import Field from brain_brew.representation.yaml.note_model_template import Template -from brain_brew.representation.yaml.part_holder import PartHolder @dataclass diff --git a/brain_brew/build_tasks/deck_parts/note_model_template_from_html_files.py b/brain_brew/build_tasks/deck_parts/note_model_template_from_html_files.py index 9635127..1f91c9c 100644 --- a/brain_brew/build_tasks/deck_parts/note_model_template_from_html_files.py +++ b/brain_brew/build_tasks/deck_parts/note_model_template_from_html_files.py @@ -1,11 +1,11 @@ from dataclasses import dataclass, field from typing import Optional -from brain_brew.representation.build_config.build_task import BuildPartTask -from brain_brew.representation.configuration.representation_base import RepresentationBase +from brain_brew.configuration.build_config.build_task import BuildPartTask +from brain_brew.configuration.part_holder import PartHolder +from brain_brew.configuration.representation_base import RepresentationBase from brain_brew.representation.generic.html_file import HTMLFile from brain_brew.representation.yaml.note_model_template import Template -from brain_brew.representation.yaml.part_holder import PartHolder html_separator = '--' diff --git a/brain_brew/representation/build_config/__init__.py b/brain_brew/configuration/__init__.py similarity index 100% rename from brain_brew/representation/build_config/__init__.py rename to brain_brew/configuration/__init__.py diff --git a/brain_brew/representation/configuration/anki_field.py b/brain_brew/configuration/anki_field.py similarity index 100% rename from brain_brew/representation/configuration/anki_field.py rename to brain_brew/configuration/anki_field.py diff --git a/brain_brew/argument_reader.py b/brain_brew/configuration/argument_reader.py similarity index 100% rename from brain_brew/argument_reader.py rename to brain_brew/configuration/argument_reader.py diff --git a/brain_brew/representation/configuration/__init__.py b/brain_brew/configuration/build_config/__init__.py similarity index 100% rename from brain_brew/representation/configuration/__init__.py rename to brain_brew/configuration/build_config/__init__.py diff --git a/brain_brew/representation/build_config/build_task.py b/brain_brew/configuration/build_config/build_task.py similarity index 96% rename from brain_brew/representation/build_config/build_task.py rename to brain_brew/configuration/build_config/build_task.py index 48cde25..d449020 100644 --- a/brain_brew/representation/build_config/build_task.py +++ b/brain_brew/configuration/build_config/build_task.py @@ -1,5 +1,5 @@ from abc import ABCMeta, abstractmethod -from typing import Dict, List, Type, Tuple, Set +from typing import Dict, Type, Set from brain_brew.interfaces.yamale_verifyable import YamlRepr diff --git a/brain_brew/representation/build_config/parts_builder.py b/brain_brew/configuration/build_config/parts_builder.py similarity index 88% rename from brain_brew/representation/build_config/parts_builder.py rename to brain_brew/configuration/build_config/parts_builder.py index 074ef43..d6326cd 100644 --- a/brain_brew/representation/build_config/parts_builder.py +++ b/brain_brew/configuration/build_config/parts_builder.py @@ -1,23 +1,19 @@ -from abc import ABCMeta from dataclasses import dataclass -from typing import Dict, Type, List, Tuple, Set -from textwrap import dedent +from typing import Dict, Type, List, Set -# Build Tasks -from brain_brew.build_tasks.csvs.notes_from_csvs import NotesFromCsvs -from brain_brew.build_tasks.deck_parts.from_yaml_part import NotesFromYamlPart, HeadersFromYamlPart, \ - NoteModelsFromYamlPart, MediaGroupFromYamlPart -from brain_brew.build_tasks.deck_parts.media_group_from_folder import MediaGroupFromFolder from brain_brew.build_tasks.crowd_anki.headers_from_crowdanki import HeadersFromCrowdAnki from brain_brew.build_tasks.crowd_anki.media_group_from_crowd_anki import MediaGroupFromCrowdAnki from brain_brew.build_tasks.crowd_anki.note_models_from_crowd_anki import NoteModelsFromCrowdAnki from brain_brew.build_tasks.crowd_anki.notes_from_crowd_anki import NotesFromCrowdAnki +from brain_brew.build_tasks.csvs.notes_from_csvs import NotesFromCsvs +from brain_brew.build_tasks.deck_parts.from_yaml_part import NotesFromYamlPart, HeadersFromYamlPart, \ + NoteModelsFromYamlPart, MediaGroupFromYamlPart +from brain_brew.build_tasks.deck_parts.media_group_from_folder import MediaGroupFromFolder from brain_brew.build_tasks.deck_parts.media_group_to_folder import MediaGroupsToFolder from brain_brew.build_tasks.deck_parts.note_model_from_html_parts import NoteModelFromHTMLParts from brain_brew.build_tasks.deck_parts.note_model_template_from_html_files import TemplateFromHTML - -from brain_brew.representation.build_config.build_task import BuildTask, BuildPartTask, TopLevelBuildTask -from brain_brew.representation.build_config.recipe_builder import RecipeBuilder +from brain_brew.configuration.build_config.build_task import BuildTask, BuildPartTask, TopLevelBuildTask +from brain_brew.configuration.build_config.recipe_builder import RecipeBuilder @dataclass diff --git a/brain_brew/representation/build_config/recipe_builder.py b/brain_brew/configuration/build_config/recipe_builder.py similarity index 96% rename from brain_brew/representation/build_config/recipe_builder.py rename to brain_brew/configuration/build_config/recipe_builder.py index 94bb44c..69777ea 100644 --- a/brain_brew/representation/build_config/recipe_builder.py +++ b/brain_brew/configuration/build_config/recipe_builder.py @@ -1,10 +1,10 @@ import re from abc import ABCMeta, abstractmethod from dataclasses import dataclass +from textwrap import indent from typing import Dict, List, Type, Set -from textwrap import indent, dedent -from brain_brew.representation.build_config.build_task import BuildTask +from brain_brew.configuration.build_config.build_task import BuildTask from brain_brew.representation.yaml.yaml_object import YamlObject diff --git a/brain_brew/representation/build_config/top_level_builder.py b/brain_brew/configuration/build_config/top_level_builder.py similarity index 85% rename from brain_brew/representation/build_config/top_level_builder.py rename to brain_brew/configuration/build_config/top_level_builder.py index 73fd58f..e5ef296 100644 --- a/brain_brew/representation/build_config/top_level_builder.py +++ b/brain_brew/configuration/build_config/top_level_builder.py @@ -1,15 +1,12 @@ -from abc import ABCMeta -from typing import Dict, Type, List, Tuple, Set from textwrap import indent, dedent +from typing import Dict, Type, List, Set -# Build Tasks from brain_brew.build_tasks.crowd_anki.crowd_anki_generate import CrowdAnkiGenerate from brain_brew.build_tasks.csvs.csvs_generate import CsvsGenerate -from brain_brew.representation.build_config.parts_builder import PartsBuilder - +from brain_brew.configuration.build_config.build_task import BuildTask, TopLevelBuildTask +from brain_brew.configuration.build_config.parts_builder import PartsBuilder +from brain_brew.configuration.build_config.recipe_builder import RecipeBuilder from brain_brew.interfaces.yamale_verifyable import YamlRepr -from brain_brew.representation.build_config.recipe_builder import RecipeBuilder -from brain_brew.representation.build_config.build_task import BuildTask, TopLevelBuildTask class TopLevelBuilder(YamlRepr, RecipeBuilder): @@ -51,7 +48,7 @@ def resolve_dependencies(deps: Set[Type[BuildTask]]) -> Set[Type[BuildTask]]: def parse_and_read(cls, filename, verify_only: bool) -> 'TopLevelBuilder': recipe_data = cls.read_to_dict(filename) - from brain_brew.yaml_verifier import YamlVerifier + from brain_brew.configuration.yaml_verifier import YamlVerifier YamlVerifier.get_instance().verify_recipe(filename) if verify_only: diff --git a/brain_brew/file_manager.py b/brain_brew/configuration/file_manager.py similarity index 96% rename from brain_brew/file_manager.py rename to brain_brew/configuration/file_manager.py index d8abd54..f99e31f 100644 --- a/brain_brew/file_manager.py +++ b/brain_brew/configuration/file_manager.py @@ -1,7 +1,7 @@ from typing import Dict, Union +from brain_brew.configuration.part_holder import PartHolder from brain_brew.representation.generic.source_file import SourceFile -from brain_brew.representation.yaml.part_holder import PartHolder from brain_brew.representation.yaml.yaml_object import YamlObject diff --git a/brain_brew/representation/configuration/global_config.py b/brain_brew/configuration/global_config.py similarity index 93% rename from brain_brew/representation/configuration/global_config.py rename to brain_brew/configuration/global_config.py index 457aea4..7413df7 100644 --- a/brain_brew/representation/configuration/global_config.py +++ b/brain_brew/configuration/global_config.py @@ -1,7 +1,7 @@ from dataclasses import dataclass, field from typing import Union, Optional -from brain_brew.representation.configuration.representation_base import RepresentationBase +from brain_brew.configuration.representation_base import RepresentationBase from brain_brew.representation.yaml.yaml_object import YamlObject diff --git a/brain_brew/representation/yaml/part_holder.py b/brain_brew/configuration/part_holder.py similarity index 93% rename from brain_brew/representation/yaml/part_holder.py rename to brain_brew/configuration/part_holder.py index 86ff5b8..5140849 100644 --- a/brain_brew/representation/yaml/part_holder.py +++ b/brain_brew/configuration/part_holder.py @@ -16,7 +16,7 @@ class PartHolder(Generic[T]): @classmethod def get_file_manager(cls): if not cls.file_manager: - from brain_brew.file_manager import FileManager + from brain_brew.configuration.file_manager import FileManager cls.file_manager = FileManager.get_instance() return cls.file_manager diff --git a/brain_brew/representation/configuration/representation_base.py b/brain_brew/configuration/representation_base.py similarity index 100% rename from brain_brew/representation/configuration/representation_base.py rename to brain_brew/configuration/representation_base.py diff --git a/brain_brew/yaml_verifier.py b/brain_brew/configuration/yaml_verifier.py similarity index 93% rename from brain_brew/yaml_verifier.py rename to brain_brew/configuration/yaml_verifier.py index 98aba46..89f1bbf 100644 --- a/brain_brew/yaml_verifier.py +++ b/brain_brew/configuration/yaml_verifier.py @@ -19,7 +19,7 @@ def __init__(self): else: raise Exception("Multiple YamlVerifiers created") - path = os.path.join(os.path.dirname(__file__), "schemas/recipe.yaml") + path = os.path.join(os.path.dirname(__file__), "../schemas/recipe.yaml") self.recipe_schema = yamale.make_schema(path, parser='ruamel', validators=validators) @staticmethod diff --git a/brain_brew/main.py b/brain_brew/main.py index b44011e..9764ef8 100644 --- a/brain_brew/main.py +++ b/brain_brew/main.py @@ -1,12 +1,12 @@ import logging -from brain_brew.argument_reader import BBArgumentReader -from brain_brew.file_manager import FileManager -from brain_brew.representation.build_config.top_level_builder import TopLevelBuilder -from brain_brew.representation.configuration.global_config import GlobalConfig +from brain_brew.configuration.argument_reader import BBArgumentReader +from brain_brew.configuration.build_config.top_level_builder import TopLevelBuilder +from brain_brew.configuration.file_manager import FileManager +from brain_brew.configuration.global_config import GlobalConfig # sys.path.append(os.path.join(os.path.dirname(__file__), "dist")) # sys.path.append(os.path.dirname(__file__)) -from brain_brew.yaml_verifier import YamlVerifier +from brain_brew.configuration.yaml_verifier import YamlVerifier def main(): diff --git a/brain_brew/representation/generic/html_file.py b/brain_brew/representation/generic/html_file.py index 96b6111..c1682cf 100644 --- a/brain_brew/representation/generic/html_file.py +++ b/brain_brew/representation/generic/html_file.py @@ -1,5 +1,5 @@ -from dataclasses import dataclass import codecs +from dataclasses import dataclass from brain_brew.representation.generic.source_file import SourceFile diff --git a/brain_brew/representation/generic/source_file.py b/brain_brew/representation/generic/source_file.py index 1e42497..96231eb 100644 --- a/brain_brew/representation/generic/source_file.py +++ b/brain_brew/representation/generic/source_file.py @@ -21,7 +21,7 @@ def get_deep_copy(cls, data): @classmethod def create_or_get(cls, location): - from brain_brew.file_manager import FileManager + from brain_brew.configuration.file_manager import FileManager _file_manager = FileManager.get_instance() formatted_location = cls.formatted_file_location(location) file = _file_manager.file_if_exists(formatted_location) diff --git a/brain_brew/representation/json/crowd_anki_export.py b/brain_brew/representation/json/crowd_anki_export.py index 5a1eb69..b9d2de8 100644 --- a/brain_brew/representation/json/crowd_anki_export.py +++ b/brain_brew/representation/json/crowd_anki_export.py @@ -5,7 +5,7 @@ from brain_brew.representation.generic.source_file import SourceFile from brain_brew.representation.json.json_file import JsonFile from brain_brew.representation.json.wrappers_for_crowd_anki import CrowdAnkiJsonWrapper -from brain_brew.representation.yaml.note_model_repr import NoteModel +from brain_brew.representation.yaml.note_model import NoteModel from brain_brew.utils import create_path_if_not_exists diff --git a/brain_brew/representation/yaml/headers_repr.py b/brain_brew/representation/yaml/headers.py similarity index 100% rename from brain_brew/representation/yaml/headers_repr.py rename to brain_brew/representation/yaml/headers.py diff --git a/brain_brew/representation/yaml/media_group_repr.py b/brain_brew/representation/yaml/media_group.py similarity index 100% rename from brain_brew/representation/yaml/media_group_repr.py rename to brain_brew/representation/yaml/media_group.py diff --git a/brain_brew/representation/yaml/note_model_repr.py b/brain_brew/representation/yaml/note_model.py similarity index 97% rename from brain_brew/representation/yaml/note_model_repr.py rename to brain_brew/representation/yaml/note_model.py index 0218d63..11f7bdd 100644 --- a/brain_brew/representation/yaml/note_model_repr.py +++ b/brain_brew/representation/yaml/note_model.py @@ -2,9 +2,9 @@ from dataclasses import dataclass, field from typing import List, Union, Dict, Set +from brain_brew.configuration.anki_field import AnkiField +from brain_brew.configuration.representation_base import RepresentationBase from brain_brew.interfaces.media_container import MediaContainer -from brain_brew.representation.configuration.anki_field import AnkiField -from brain_brew.representation.configuration.representation_base import RepresentationBase from brain_brew.representation.yaml.note_model_field import Field from brain_brew.representation.yaml.note_model_template import Template from brain_brew.representation.yaml.yaml_object import YamlObject diff --git a/brain_brew/representation/yaml/note_model_field.py b/brain_brew/representation/yaml/note_model_field.py index f83e5a9..10e7a5e 100644 --- a/brain_brew/representation/yaml/note_model_field.py +++ b/brain_brew/representation/yaml/note_model_field.py @@ -1,9 +1,9 @@ from dataclasses import dataclass, field from typing import List, Union +from brain_brew.configuration.anki_field import AnkiField +from brain_brew.configuration.representation_base import RepresentationBase from brain_brew.interfaces.yamale_verifyable import YamlRepr -from brain_brew.representation.configuration.anki_field import AnkiField -from brain_brew.representation.configuration.representation_base import RepresentationBase NAME = AnkiField("name") ORDINAL = AnkiField("ord", "ordinal") diff --git a/brain_brew/representation/yaml/note_model_template.py b/brain_brew/representation/yaml/note_model_template.py index 7c5af8e..e99f882 100644 --- a/brain_brew/representation/yaml/note_model_template.py +++ b/brain_brew/representation/yaml/note_model_template.py @@ -1,8 +1,8 @@ from dataclasses import dataclass, field from typing import Optional, Union, Set -from brain_brew.representation.configuration.anki_field import AnkiField -from brain_brew.representation.configuration.representation_base import RepresentationBase +from brain_brew.configuration.anki_field import AnkiField +from brain_brew.configuration.representation_base import RepresentationBase from brain_brew.representation.yaml.yaml_object import YamlObject from brain_brew.utils import find_media_in_field diff --git a/brain_brew/representation/yaml/note_repr.py b/brain_brew/representation/yaml/notes.py similarity index 98% rename from brain_brew/representation/yaml/note_repr.py rename to brain_brew/representation/yaml/notes.py index 0aed34a..5d70a5f 100644 --- a/brain_brew/representation/yaml/note_repr.py +++ b/brain_brew/representation/yaml/notes.py @@ -3,8 +3,8 @@ from dataclasses import dataclass from typing import List, Optional, Dict, Set +from brain_brew.configuration.global_config import GlobalConfig from brain_brew.interfaces.media_container import MediaContainer -from brain_brew.representation.configuration.global_config import GlobalConfig from brain_brew.representation.yaml.yaml_object import YamlObject from brain_brew.utils import find_media_in_field diff --git a/brain_brew/representation/configuration/csv_file_mapping.py b/brain_brew/transformers/file_mapping.py similarity index 98% rename from brain_brew/representation/configuration/csv_file_mapping.py rename to brain_brew/transformers/file_mapping.py index d1581f9..9cc2533 100644 --- a/brain_brew/representation/configuration/csv_file_mapping.py +++ b/brain_brew/transformers/file_mapping.py @@ -2,8 +2,8 @@ from dataclasses import dataclass, field from typing import Dict, List, Optional, Union +from brain_brew.configuration.representation_base import RepresentationBase from brain_brew.interfaces.yamale_verifyable import YamlRepr -from brain_brew.representation.configuration.representation_base import RepresentationBase from brain_brew.representation.generic.csv_file import CsvFile, CsvKeys from brain_brew.utils import single_item_to_list, generate_anki_guid diff --git a/brain_brew/transformers/media_group_from_location.py b/brain_brew/transformers/media_group_from_location.py index a04b77a..ee09946 100644 --- a/brain_brew/transformers/media_group_from_location.py +++ b/brain_brew/transformers/media_group_from_location.py @@ -1,8 +1,8 @@ from typing import List +from brain_brew.configuration.part_holder import PartHolder from brain_brew.interfaces.media_container import MediaContainer -from brain_brew.representation.yaml.media_group_repr import MediaGroup -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.representation.yaml.media_group import MediaGroup def create_media_group_from_location( diff --git a/brain_brew/transformers/media_group_save_to_location.py b/brain_brew/transformers/media_group_save_to_location.py index 2ef898b..e756f4c 100644 --- a/brain_brew/transformers/media_group_save_to_location.py +++ b/brain_brew/transformers/media_group_save_to_location.py @@ -2,7 +2,7 @@ from typing import List, Set from brain_brew.representation.generic.media_file import MediaFile -from brain_brew.representation.yaml.media_group_repr import MediaGroup +from brain_brew.representation.yaml.media_group import MediaGroup from brain_brew.utils import create_path_if_not_exists diff --git a/brain_brew/representation/configuration/note_model_mapping.py b/brain_brew/transformers/note_model_mapping.py similarity index 95% rename from brain_brew/representation/configuration/note_model_mapping.py rename to brain_brew/transformers/note_model_mapping.py index 0ab7642..bcb48b4 100644 --- a/brain_brew/representation/configuration/note_model_mapping.py +++ b/brain_brew/transformers/note_model_mapping.py @@ -2,11 +2,11 @@ from enum import Enum from typing import List, Union, Dict +from brain_brew.configuration.part_holder import PartHolder +from brain_brew.configuration.representation_base import RepresentationBase from brain_brew.interfaces.yamale_verifyable import YamlRepr -from brain_brew.representation.configuration.representation_base import RepresentationBase -from brain_brew.representation.yaml.note_model_repr import NoteModel -from brain_brew.representation.yaml.note_repr import GUID, TAGS -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.representation.yaml.note_model import NoteModel +from brain_brew.representation.yaml.notes import GUID, TAGS from brain_brew.utils import single_item_to_list diff --git a/brain_brew/utils.py b/brain_brew/utils.py index f16f4f3..685c40d 100644 --- a/brain_brew/utils.py +++ b/brain_brew/utils.py @@ -66,7 +66,7 @@ def split_tags(tags_value: str) -> list: def join_tags(tags_list: list) -> str: - from brain_brew.representation.configuration.global_config import GlobalConfig + from brain_brew.configuration.global_config import GlobalConfig return GlobalConfig.get_instance().join_values_with.join(tags_list) @@ -92,7 +92,7 @@ def base91(num: int) -> str: def sort_dict(data, sort_by_keys, reverse_sort, case_insensitive_sort=None): - from brain_brew.representation.configuration.global_config import GlobalConfig + from brain_brew.configuration.global_config import GlobalConfig if case_insensitive_sort is None: case_insensitive_sort = GlobalConfig.get_instance().sort_case_insensitive diff --git a/scripts/yamale_build.py b/scripts/yamale_build.py index 296ca33..a429b03 100644 --- a/scripts/yamale_build.py +++ b/scripts/yamale_build.py @@ -1,8 +1,9 @@ -import sys import os +import sys + sys.path.append(os.path.abspath('')) -from brain_brew.representation.build_config.top_level_builder import TopLevelBuilder +from brain_brew.configuration.build_config.top_level_builder import TopLevelBuilder build: str = TopLevelBuilder.build_yamale() filepath = "brain_brew/schemas/recipe.yaml" diff --git a/tests/representation/configuration/test_csv_file_mapping.py b/tests/representation/configuration/test_csv_file_mapping.py index a2fb4fa..0f2b75b 100644 --- a/tests/representation/configuration/test_csv_file_mapping.py +++ b/tests/representation/configuration/test_csv_file_mapping.py @@ -1,17 +1,3 @@ -import copy -from typing import List -from unittest.mock import patch - -import pytest - -from brain_brew.representation.configuration.csv_file_mapping import FileMappingDerivative, FileMapping, \ - SORT_BY_COLUMNS, REVERSE_SORT, NOTE_MODEL, DERIVATIVES, FILE -from brain_brew.representation.generic.csv_file import CsvFile -from tests.test_file_manager import get_new_file_manager -from tests.representation.generic.test_csv_file import csv_test1, csv_test2, csv_test3, csv_test1_split1,\ - csv_test1_split2, csv_test2_missing_guids - - # def setup_csv_fm_config(csv: str, sort_by_columns: List[str] = None, reverse_sort: bool = None, # note_model_name: str = None, derivatives: List[dict] = None): # cfm: dict = { diff --git a/tests/representation/generic/test_media_file.py b/tests/representation/generic/test_media_file.py index 56d4ac2..9711021 100644 --- a/tests/representation/generic/test_media_file.py +++ b/tests/representation/generic/test_media_file.py @@ -1,7 +1,3 @@ -import os -import shutil -from unittest.mock import patch - import pytest from brain_brew.representation.generic.media_file import MediaFile diff --git a/tests/representation/yaml/test_note_model_repr.py b/tests/representation/yaml/test_note_model_repr.py index 45ddcd0..a6a3cad 100644 --- a/tests/representation/yaml/test_note_model_repr.py +++ b/tests/representation/yaml/test_note_model_repr.py @@ -1,15 +1,14 @@ import pytest -from brain_brew.representation.yaml.note_model_repr import NoteModel +from brain_brew.representation.json.json_file import JsonFile +from brain_brew.representation.yaml.note_model import NoteModel from brain_brew.representation.yaml.note_model_field import Field from brain_brew.representation.yaml.note_model_template import Template -from brain_brew.representation.json.json_file import JsonFile from brain_brew.representation.yaml.yaml_object import YamlObject from tests.test_files import TestFiles # CrowdAnki Files -------------------------------------------------------------------------- -from tests.test_helpers import debug_write_part_to_file @pytest.fixture diff --git a/tests/representation/yaml/test_note_repr.py b/tests/representation/yaml/test_note_repr.py index 06755d0..1a704f5 100644 --- a/tests/representation/yaml/test_note_repr.py +++ b/tests/representation/yaml/test_note_repr.py @@ -1,13 +1,9 @@ -import json -import sys from textwrap import dedent from typing import List, Set -from ruamel.yaml import round_trip_dump -from brain_brew.representation.yaml.yaml_object import yaml_dump, yaml_load import pytest -from brain_brew.representation.yaml.note_repr import Note, NoteGrouping, Notes, \ +from brain_brew.representation.yaml.notes import Note, NoteGrouping, Notes, \ NOTES, NOTE_GROUPINGS, FIELDS, GUID, NOTE_MODEL, TAGS, FLAGS working_notes = { diff --git a/tests/test_argument_reader.py b/tests/test_argument_reader.py index 94c12a9..43827b1 100644 --- a/tests/test_argument_reader.py +++ b/tests/test_argument_reader.py @@ -3,7 +3,7 @@ import pytest -from brain_brew.argument_reader import BBArgumentReader +from brain_brew.configuration.argument_reader import BBArgumentReader @pytest.fixture() diff --git a/tests/test_file_manager.py b/tests/test_file_manager.py index 8dbda96..e69d0ad 100644 --- a/tests/test_file_manager.py +++ b/tests/test_file_manager.py @@ -1,6 +1,4 @@ -import pytest - -from brain_brew.file_manager import FileManager +from brain_brew.configuration.file_manager import FileManager def get_new_file_manager(): diff --git a/tests/test_helpers.py b/tests/test_helpers.py index 7af2e32..863e869 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -1,4 +1,4 @@ -from brain_brew.representation.yaml.part_holder import PartHolder +from brain_brew.configuration.part_holder import PartHolder def debug_write_part_to_file(part, filepath: str): diff --git a/tests/test_utils.py b/tests/test_utils.py index 523c951..86e2546 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,6 +1,6 @@ import pytest -from brain_brew.utils import find_media_in_field, str_to_lowercase_no_separators, split_tags, join_tags +from brain_brew.utils import find_media_in_field, str_to_lowercase_no_separators, split_tags class TestFindMedia: