Source code for academic_metrics.factories.strategy_factory
from __future__ import annotations
import logging
import os
from typing import TYPE_CHECKING
from academic_metrics.configs import (
configure_logging,
DEBUG,
)
from academic_metrics.enums import AttributeTypes
from academic_metrics.utils import WarningManager
if TYPE_CHECKING:
from academic_metrics.strategies import AttributeExtractionStrategy
[docs]
class StrategyFactory:
"""
A factory class for managing and retrieving attribute extraction strategies.
This class provides a mechanism to register and retrieve different strategies for extracting attributes from data entries. It uses a dictionary to map attribute types to their corresponding strategy classes, allowing for flexible and dynamic strategy management.
Attributes:
_strategies (dict): A class-level dictionary that maps attribute types to their corresponding strategy classes.
Methods:
register_strategy(*attribute_types): Registers a strategy class for one or more attribute types.
get_strategy(attribute_type, warning_manager): Retrieves the strategy class for a given attribute type and initializes it with a warning manager.
Usage:
- Add a strategy to the factory:
- StrategyFactory.register_strategy(AttributeTypes.TITLE)(TitleExtractionStrategy)
- Add the enum to enums.py
- get a strategy from the factory:
- get_attributes() in utilities.py will then use this factory to get the strategy for a given attribute type.
"""
_strategies = {}
[docs]
def __init__(self):
"""Initializes the StrategyFactory."""
self.logger = configure_logging(
module_name=__name__,
log_file_name="strategy_factory",
log_level=DEBUG,
)
[docs]
@classmethod
def register_strategy(
cls,
*attribute_types: AttributeTypes,
):
"""
Registers a strategy class for one or more attribute types.
This method is used to associate a strategy class with specific attribute types. The strategy class
is stored in the _strategies dictionary, allowing it to be retrieved later based on the attribute type.
Args:
*attribute_types (AttributeTypes): One or more attribute types to associate with the strategy class.
Returns:
function: A decorator function that registers the strategy class.
"""
def decorator(strategy_class):
for attribute_type in attribute_types:
cls._strategies[attribute_type] = strategy_class
return strategy_class
return decorator
[docs]
@classmethod
def get_strategy(
cls, attribute_type: AttributeTypes, warning_manager: WarningManager
):
"""
Retrieves the strategy class for a given attribute type and initializes it with a warning manager.
This method looks up the strategy class associated with the specified attribute type in the _strategies
dictionary. If a strategy class is found, it is instantiated with the provided warning manager and returned.
Args:
attribute_type (AttributeTypes):
- The attribute type for which to retrieve the strategy class.
warning_manager (WarningManager):
- An instance of WarningManager to be passed to the strategy class.
Returns:
strategy (AttributeExtractionStrategy):
- An instance of the strategy class associated with the specified attribute type.
Raises:
ValueError:
- If no strategy is found for the specified attribute type.
"""
strategy_class: AttributeExtractionStrategy = cls._strategies.get(
attribute_type
)
if not strategy_class:
raise ValueError(f"No strategy found for attribute type: {attribute_type}")
return strategy_class(warning_manager)