# -*- coding: utf-8 -*- import os import json from abc import ABCMeta, abstractmethod DEFAULT_METADATA_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "metadata")) class BaseFetcher(object): __metaclass__ = ABCMeta def __init__(self, provider_name, metadata_dir=None): if self.__class__ is BaseFetcher: raise TypeError("Cannot instantiate abstract class BaseFetcher directly") self.provider_name = provider_name self.metadata_dir = metadata_dir or DEFAULT_METADATA_DIR self.metadata = self._load_metadata() def _load_metadata(self): file_path = os.path.join(self.metadata_dir, "{}_meta.json".format(self.provider_name)) if not os.path.exists(file_path): return {} try: with open(file_path, "r") as f: return json.load(f) except Exception: return {} def fetch_external_vac_info(self, origin, target, visa_type, vac_code=None): """ Hook for retrieving VAC information online from external tools/APIs when not found in metadata. """ return None @abstractmethod def fetch_free_config(self, origin, target, visa_type, vac_code=None): pass