| 9 | import wrapt |
| 10 | |
| 11 | class GcpModuleFinder(importlib.abc.MetaPathFinder): |
| 12 | _MODULES = [ |
| 13 | 'google.cloud.bigquery', |
| 14 | 'google.cloud.storage', |
| 15 | 'google.cloud.translate', |
| 16 | 'google.cloud.translate_v2', |
| 17 | 'google.cloud.translate_v3', |
| 18 | 'google.cloud.language', |
| 19 | 'google.cloud.language_v1', |
| 20 | 'google.cloud.videointelligence', |
| 21 | 'google.cloud.videointelligence_v1', |
| 22 | 'google.cloud.vision', |
| 23 | 'google.cloud.vision_v1', |
| 24 | ] |
| 25 | _KAGGLE_GCP_PATH = 'kaggle_gcp.py' |
| 26 | def __init__(self): |
| 27 | pass |
| 28 | |
| 29 | def _is_called_from_kaggle_gcp(self): |
| 30 | import inspect |
| 31 | for frame in inspect.stack(): |
| 32 | if os.path.basename(frame.filename) == self._KAGGLE_GCP_PATH: |
| 33 | return True |
| 34 | return False |
| 35 | |
| 36 | def find_spec(self, fullname, path, target=None): |
| 37 | if fullname in self._MODULES: |
| 38 | # If being called from kaggle_gcp, don't return our |
| 39 | # monkeypatched module to avoid circular dependency, |
| 40 | # since we call kaggle_gcp to load the module. |
| 41 | if self._is_called_from_kaggle_gcp(): |
| 42 | return None |
| 43 | return importlib.machinery.ModuleSpec(fullname, GcpModuleLoader()) |
| 44 | |
| 45 | |
| 46 | class GcpModuleLoader(importlib.abc.Loader): |