Created a new flow generator + tests for it.

This commit is contained in:
pablo 2020-12-31 18:28:48 +01:00
parent b8d4893026
commit 2b249063e0
2 changed files with 64 additions and 1 deletions

View file

@ -1,4 +1,4 @@
from typing import Union, Iterable, Dict, Callable from typing import Union, Iterable, Dict, Callable, Type
import re import re
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
@ -553,3 +553,38 @@ class ParsingFlow:
issues[field.field_name] = this_field_issues issues[field.field_name] = this_field_issues
return issues return issues
class ParsingFlowGenerator:
"""
Class for creating multiple, empty flows based on a group of instructions.
"""
def __init__(
self,
parsing_flow_class: Type[ParsingFlow],
instructions_to_attach_with_params: Dict[
Type[BaseTargetFieldInstructions], dict
],
) -> None:
"""
Set the flow class and group of instructions to use when creating new
instances of the flow class.
:param parsing_flow_class: the flow class to instantiate
:param instructions_to_attach_with_params: a key-value pair of field
instructions class and the paramteres to use when instantiating them
"""
self._parsing_flow_class = parsing_flow_class
self._instructions_to_attach_with_params = instructions_to_attach_with_params
def get_new_flow(self) -> ParsingFlow:
"""
Instantiate a new parsing flow with the instantiated classes attached.
:return: the new parsing flow
"""
new_parsing_flow = self._parsing_flow_class()
for instruction, params in self._instructions_to_attach_with_params.items():
new_parsing_flow.add_instructions(instruction(**params))
return new_parsing_flow

View file

@ -4,6 +4,7 @@ from bs4 import BeautifulSoup
from core.parsing_utils import ( from core.parsing_utils import (
ParsingFlow, ParsingFlow,
ParsingFlowGenerator,
ReferenciaFieldInstructions, ReferenciaFieldInstructions,
PrecioFieldInstructions, PrecioFieldInstructions,
TamanoCategoricoFieldInstructions, TamanoCategoricoFieldInstructions,
@ -2725,3 +2726,30 @@ def test_parsing_flow_fails_for_unrelated_html(unrelated_html):
assert not parsing_flow.all_non_optional_fields_were_found and len( assert not parsing_flow.all_non_optional_fields_were_found and len(
parsing_flow.issues parsing_flow.issues
) == len(all_instructions) ) == len(all_instructions)
def test_parsing_flow_generator_returns_proper_flows():
four_instructions_with_params = {
ReferenciaFieldInstructions: {},
PrecioFieldInstructions: {},
TamanoCategoricoFieldInstructions: {},
SecondaryFeaturesFieldInstructions: {
"field_name": "personal",
"search_keyword": "Personal",
},
}
parsing_flow_generator = ParsingFlowGenerator(
parsing_flow_class=ParsingFlow,
instructions_to_attach_with_params=four_instructions_with_params,
)
a_new_parsing_flow = parsing_flow_generator.get_new_flow()
assert (
isinstance(a_new_parsing_flow, ParsingFlow),
len(a_new_parsing_flow._instructions) == len(four_instructions_with_params),
all([field.found is None for field in a_new_parsing_flow._instructions]),
all([field.valid is None for field in a_new_parsing_flow._instructions]),
)