Skip to content

Commit

Permalink
Ug feeback changes (#13)
Browse files Browse the repository at this point in the history
* Task Matching

* Builder files -> Recipe;
Deck Part Name -> Part Id

* Release V0.2.4
  • Loading branch information
ohare93 authored Oct 4, 2020
1 parent 0fc5719 commit 5ec6b3f
Show file tree
Hide file tree
Showing 29 changed files with 110 additions and 119 deletions.
1 change: 1 addition & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include brain_brew/schemas/recipe.yaml
2 changes: 1 addition & 1 deletion Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ pytest = "==5.4.1"
args = "==0.1.0"
clint = "==0.5.1"
coverage = "==4.5.4"
ruamel-yaml = "==0.16.10"
"ruamel.yaml" = "==0.16.10"
yamale = "==3.0.4"
PyYaml = "*"

Expand Down
23 changes: 12 additions & 11 deletions Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions brain_brew/argument_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ def __init__(self):

def _set_parser_arguments(self):
self.add_argument(
"builder_file",
metavar="builder file",
"recipe",
metavar="recipe",
type=str,
help="Run a builder file"
help="Yaml file to use as the recipe"
)
self.add_argument(
"--config", "--global-config", "-c",
Expand All @@ -30,20 +30,20 @@ def _set_parser_arguments(self):
action="store_true",
dest="verify_only",
default=False,
help="Only verify the builder contents, without running it."
help="Only verify the recipe contents, without running it."
)

def get_parsed(self, override_args=None):
parsed_args = self.parse_args(args=override_args)

# Required
builder = self.error_if_blank(parsed_args.builder_file)
recipe = self.error_if_blank(parsed_args.recipe)

# Optional
config_file = parsed_args.config_file
verify_only = parsed_args.verify_only

return builder, config_file, verify_only
return recipe, config_file, verify_only

def error_if_blank(self, arg):
if arg == "" or arg is None:
Expand Down
3 changes: 1 addition & 2 deletions brain_brew/build_tasks/crowd_anki/crowd_anki_generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,11 @@

from brain_brew.representation.build_config.build_task import TopLevelBuildTask
from brain_brew.representation.build_config.representation_base import RepresentationBase
from brain_brew.utils import all_combos_prepend_append


@dataclass
class CrowdAnkiGenerate(TopLevelBuildTask):
task_regex = r'.*crowd[\s_-]*?anki.*'
task_regex = r'generate_crowd_anki'

@dataclass
class Representation(RepresentationBase):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,11 @@
from brain_brew.representation.build_config.representation_base import RepresentationBase
from brain_brew.representation.json.crowd_anki_export import CrowdAnkiExport
from brain_brew.representation.yaml.note_model_repr import NoteModel
from brain_brew.utils import all_combos_prepend_append


@dataclass
class CrowdAnkiToDeckParts(DeckPartBuildTask):
task_regex = r'.*crowd[\s_-]*?anki.*'
task_regex = r'from_crowd_anki'

@dataclass
class Representation(RepresentationBase):
Expand Down
4 changes: 2 additions & 2 deletions brain_brew/build_tasks/crowd_anki/headers_from_crowdanki.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ class Representation(BaseDeckPartsFrom.Representation):
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(
name=rep.name,
part_id=rep.part_id,
save_to_file=rep.save_to_file
)

def execute(self, ca_wrapper: CrowdAnkiJsonWrapper):
headers = Headers(self.crowd_anki_to_headers(ca_wrapper.data))

DeckPartHolder.override_or_create(self.name, self.save_to_file, headers)
DeckPartHolder.override_or_create(self.part_id, self.save_to_file, headers)

return headers

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ class Representation(BaseDeckPartsFrom.Representation):
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(
name=rep.name,
model_name=rep.model_name or rep.name,
part_id=rep.part_id,
model_name=rep.model_name or rep.part_id,
save_to_file=rep.save_to_file
)

Expand Down Expand Up @@ -51,7 +51,7 @@ def execute(self, ca_wrapper: CrowdAnkiJsonWrapper) -> List[NoteModel]:
extra_models.remove(nm_item.model_name)

deck_part = NoteModel.from_crowdanki(model)
DeckPartHolder.override_or_create(nm_item.name, nm_item.save_to_file, deck_part)
DeckPartHolder.override_or_create(nm_item.part_id, nm_item.save_to_file, deck_part)

dp_note_models.append(deck_part)

Expand Down
4 changes: 2 additions & 2 deletions brain_brew/build_tasks/crowd_anki/notes_from_crowd_anki.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class Representation(BaseDeckPartsFrom.Representation):
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(
name=rep.name,
part_id=rep.part_id,
sort_order=SharedBaseNotes._get_sort_order(rep.sort_order),
reverse_sort=SharedBaseNotes._get_reverse_sort(rep.reverse_sort),
save_to_file=rep.save_to_file
Expand All @@ -33,7 +33,7 @@ def execute(self, ca_wrapper: CrowdAnkiJsonWrapper, nm_id_to_name: dict) -> Note

notes = Notes.from_list_of_notes(note_list) # TODO: pass in sort method

DeckPartHolder.override_or_create(self.name, self.save_to_file, notes)
DeckPartHolder.override_or_create(self.part_id, self.save_to_file, notes)

return notes

Expand Down
6 changes: 3 additions & 3 deletions brain_brew/build_tasks/csvs/csvs_generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@
from brain_brew.representation.configuration.note_model_mapping import NoteModelMapping
from brain_brew.representation.yaml.deck_part_holder import DeckPartHolder
from brain_brew.representation.yaml.note_repr import Notes, Note
from brain_brew.utils import all_combos_prepend_append, join_tags
from brain_brew.utils import join_tags


@dataclass
class CsvsGenerate(SharedBaseCsvs, TopLevelBuildTask):
task_regex = r'.*csv.*'
task_regex = r'generate_csvs'

notes_to_read: str
notes: DeckPartHolder[Notes] = field(default=None)
Expand Down Expand Up @@ -52,7 +52,7 @@ def execute(self):

def verify_notes_match_note_model_mappings(self, notes: List[Note]):
note_models_used = {note.note_model for note in notes}
errors = [TypeError(f"Unknown note model type '{model}' in deck part '{self.notes.name}'. "
errors = [TypeError(f"Unknown note model type '{model}' in deck part '{self.notes.part_id}'. "
f"Add mapping for that model.")
for model in note_models_used if model not in self.note_model_mappings.keys()]

Expand Down
3 changes: 1 addition & 2 deletions brain_brew/build_tasks/csvs/csvs_to_deck_parts.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@
from brain_brew.build_tasks.csvs.notes_from_csvs import NotesFromCsvs
from brain_brew.representation.build_config.build_task import DeckPartBuildTask
from brain_brew.representation.build_config.representation_base import RepresentationBase
from brain_brew.utils import all_combos_prepend_append


@dataclass
class CsvsToDeckParts(DeckPartBuildTask):
task_regex = r'.*csv.*'
task_regex = r'from_csvs'

@dataclass
class Representation(RepresentationBase):
Expand Down
8 changes: 4 additions & 4 deletions brain_brew/build_tasks/csvs/notes_from_csvs.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@
class NotesFromCsvs(SharedBaseCsvs, BaseDeckPartsFrom):
@dataclass(init=False)
class Representation(SharedBaseCsvs.Representation, BaseDeckPartsFrom.Representation):
def __init__(self, name, file_mappings, note_model_mappings, save_to_file=None):
def __init__(self, part_id, file_mappings, note_model_mappings, save_to_file=None):
SharedBaseCsvs.Representation.__init__(self, file_mappings, note_model_mappings)
BaseDeckPartsFrom.Representation.__init__(self, name, save_to_file)
BaseDeckPartsFrom.Representation.__init__(self, part_id, save_to_file)

@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(
name=rep.name,
part_id=rep.part_id,
save_to_file=rep.save_to_file,
file_mappings=rep.get_file_mappings(),
note_model_mappings_to_read=rep.note_model_mappings
Expand All @@ -40,7 +40,7 @@ def execute(self):
deck_part_notes: List[Note] = [self.csv_row_to_note(row, self.note_model_mappings) for row in csv_rows]

notes = Notes.from_list_of_notes(deck_part_notes)
DeckPartHolder.override_or_create(self.name, self.save_to_file, notes)
DeckPartHolder.override_or_create(self.part_id, self.save_to_file, notes)

@staticmethod
def csv_row_to_note(row: dict, note_model_mappings: Dict[str, NoteModelMapping]) -> Note:
Expand Down
2 changes: 1 addition & 1 deletion brain_brew/build_tasks/csvs/shared_base_csvs.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ def verify_contents(self):
missing_columns = [col for col in holder.deck_part.field_names_lowercase if
col not in nm_map.csv_headers_map_to_note_fields(available_columns)]
if missing_columns:
logging.warning(f"Csvs are missing columns from {holder.name} {missing_columns}")
logging.warning(f"Csvs are missing columns from {holder.part_id} {missing_columns}")

if errors:
raise Exception(errors)
11 changes: 5 additions & 6 deletions brain_brew/build_tasks/deck_parts/from_deck_part.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,15 @@
from brain_brew.representation.yaml.headers_repr import Headers
from brain_brew.representation.yaml.note_model_repr import NoteModel
from brain_brew.representation.yaml.note_repr import Notes
from brain_brew.utils import all_combos_prepend_append


@dataclass
class FromDeckParts(DeckPartBuildTask):
task_regex = r'.*deck[\s_-]*?part.*'
task_regex = r'from_deck_parts'

@dataclass
class DeckPartToRead(RepresentationBase):
name: str
part_id: str
file: str

@dataclass
Expand All @@ -39,11 +38,11 @@ def from_repr(cls, data: Union[Representation, dict]):

return cls(
notes=[DeckPartHolder.override_or_create(
name=note.name, save_to_file=None, deck_part=Notes.from_file(note.file)) for note in notes],
part_id=note.part_id, save_to_file=None, deck_part=Notes.from_file(note.file)) for note in notes],
note_models=[DeckPartHolder.override_or_create(
name=model.name, save_to_file=None, deck_part=NoteModel.from_file(model.file)) for model in note_models],
part_id=model.part_id, save_to_file=None, deck_part=NoteModel.from_file(model.file)) for model in note_models],
headers=[DeckPartHolder.override_or_create(
name=header.name, save_to_file=None, deck_part=Headers.from_file(header.file)) for header in headers]
part_id=header.part_id, save_to_file=None, deck_part=Headers.from_file(header.file)) for header in headers]
)

def execute(self):
Expand Down
6 changes: 3 additions & 3 deletions brain_brew/file_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,9 @@ def _register_media_file(self, file: MediaFile):
f" and '{self.known_media_files_dict[file.filename].source_loc}'")

def new_deck_part(self, dp: DeckPartHolder) -> DeckPartHolder:
if dp.name in self.deck_part_pool:
raise KeyError(f"Cannot use same name '{dp.name}' for multiple Deck Parts")
self.deck_part_pool.setdefault(dp.name, dp)
if dp.part_id in self.deck_part_pool:
raise KeyError(f"Cannot use same name '{dp.part_id}' for multiple Deck Parts")
self.deck_part_pool.setdefault(dp.part_id, dp)
return dp

# Gets
Expand Down
8 changes: 4 additions & 4 deletions brain_brew/main.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import logging

from brain_brew.argument_reader import BBArgumentReader
from brain_brew.representation.build_config.top_level_task_builder import TopLevelTaskBuilder
from brain_brew.representation.build_config.top_level_recipe_builder import TopLevelRecipeBuilder
from brain_brew.file_manager import FileManager
from brain_brew.representation.configuration.global_config import GlobalConfig

Expand All @@ -15,19 +15,19 @@ def main():

# Read in Arguments
argument_reader = BBArgumentReader()
builder_file_name, global_config_file, verify_only = argument_reader.get_parsed()
recipe_file_name, global_config_file, verify_only = argument_reader.get_parsed()

# Read in Global Config File
global_config = GlobalConfig.from_file(global_config_file) if global_config_file else GlobalConfig.from_file()
file_manager = FileManager()

# Parse Build Config File
YamlVerifier()
builder = TopLevelTaskBuilder.parse_and_read(builder_file_name)
recipe = TopLevelRecipeBuilder.parse_and_read(recipe_file_name)

# If all good, execute it
if not verify_only:
builder.execute()
recipe.execute()


if __name__ == "__main__":
Expand Down
13 changes: 6 additions & 7 deletions brain_brew/representation/build_config/generate_deck_parts.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,17 @@
from typing import Dict, Type, List

from brain_brew.representation.build_config.build_task import BuildTask, TopLevelBuildTask, DeckPartBuildTask
from brain_brew.representation.build_config.task_builder import TaskBuilder
from brain_brew.representation.build_config.recipe_builder import RecipeBuilder

# Build Tasks
from brain_brew.build_tasks.deck_parts.from_deck_part import FromDeckParts
from brain_brew.build_tasks.csvs.csvs_to_deck_parts import CsvsToDeckParts
from brain_brew.build_tasks.crowd_anki.crowd_anki_to_deck_parts import CrowdAnkiToDeckParts
from brain_brew.utils import str_to_lowercase_no_separators
from brain_brew.build_tasks.deck_parts.from_deck_part import FromDeckParts # noqa
from brain_brew.build_tasks.csvs.csvs_to_deck_parts import CsvsToDeckParts # noqa
from brain_brew.build_tasks.crowd_anki.crowd_anki_to_deck_parts import CrowdAnkiToDeckParts # noqa


@dataclass
class GenerateDeckParts(TaskBuilder, TopLevelBuildTask):
task_regex = r'.*deck[\s_-]*?part.*'
class BuildDeckParts(RecipeBuilder, TopLevelBuildTask):
task_regex = r'build_deck_parts'

@classmethod
def known_task_dict(cls) -> Dict[str, Type[BuildTask]]:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@


@dataclass
class TaskBuilder(YamlRepr):
class RecipeBuilder(YamlRepr):
tasks: List[BuildTask]

@classmethod
Expand Down
Loading

0 comments on commit 5ec6b3f

Please sign in to comment.