Lazy load yubikey module to avoid lib errors when not in use

This commit is contained in:
Jay Lee
2021-04-07 09:27:13 -04:00
parent f45639e6e2
commit d6c2c6a2c3
4 changed files with 50 additions and 3 deletions

View File

@ -16,8 +16,12 @@ extra_files += [('cbcm-v1.1beta1.json', '.')]
extra_files += [('contactdelegation-v1.json', '.')] extra_files += [('contactdelegation-v1.json', '.')]
extra_files += [('versionhistory-v1.json', '.')] extra_files += [('versionhistory-v1.json', '.')]
hidden_imports = [
'gam.auth.yubikey',
]
a = Analysis(['gam/__main__.py'], a = Analysis(['gam/__main__.py'],
hiddenimports=[], hiddenimports=hidden_imports,
hookspath=None, hookspath=None,
excludes=['FixTk', 'tcl', 'tk', '_tkinter', 'tkinter', 'Tkinter'], excludes=['FixTk', 'tcl', 'tk', '_tkinter', 'tkinter', 'Tkinter'],
datas=extra_files, datas=extra_files,

View File

@ -46,7 +46,6 @@ from cryptography.x509.oid import NameOID
import gam.auth.oauth import gam.auth.oauth
from gam import auth from gam import auth
from gam.auth import yubikey
from gam import controlflow from gam import controlflow
from gam import display from gam import display
from gam import fileutils from gam import fileutils
@ -84,6 +83,7 @@ from gam import transport
from gam import utils from gam import utils
from gam.var import * from gam.var import *
yubikey = utils.LazyLoader('yubikey', globals(), 'gam.auth.yubikey')
from passlib.hash import sha512_crypt from passlib.hash import sha512_crypt
if platform.system() == 'Linux': if platform.system() == 'Linux':

View File

@ -6,8 +6,9 @@ import os
from google.auth.jwt import Credentials as JWTCredentials from google.auth.jwt import Credentials as JWTCredentials
import gam import gam
from gam import utils
from gam.auth import oauth from gam.auth import oauth
from gam.auth import yubikey
from gam.var import _FN_OAUTH2_TXT from gam.var import _FN_OAUTH2_TXT
from gam.var import _FN_OAUTH2SERVICE_JSON from gam.var import _FN_OAUTH2SERVICE_JSON
from gam.var import GC_OAUTH2_TXT from gam.var import GC_OAUTH2_TXT
@ -15,6 +16,7 @@ from gam.var import GC_OAUTH2SERVICE_JSON
from gam.var import GC_ENABLE_DASA from gam.var import GC_ENABLE_DASA
from gam.var import GC_Values from gam.var import GC_Values
yubikey = utils.LazyLoader('yubikey', globals(), 'gam.auth.yubikey')
# TODO: Move logic that determines file name into this module. We should be able # TODO: Move logic that determines file name into this module. We should be able
# to discover the file location without accessing a private member or waiting # to discover the file location without accessing a private member or waiting
# for a global initialization. # for a global initialization.

View File

@ -1,3 +1,7 @@
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import datetime import datetime
import re import re
import sys import sys
@ -5,8 +9,10 @@ import time
from hashlib import md5 from hashlib import md5
from html.entities import name2codepoint from html.entities import name2codepoint
from html.parser import HTMLParser from html.parser import HTMLParser
import importlib
import json import json
import dateutil.parser import dateutil.parser
import types
from gam import controlflow from gam import controlflow
from gam import fileutils from gam import fileutils
@ -14,6 +20,41 @@ from gam import transport
from gam.var import * from gam.var import *
class LazyLoader(types.ModuleType):
"""Lazily import a module, mainly to avoid pulling in large dependencies.
`contrib`, and `ffmpeg` are examples of modules that are large and not always
needed, and this allows them to only be loaded when they are used.
"""
# The lint error here is incorrect.
def __init__(self, local_name, parent_module_globals, name): # pylint: disable=super-on-old-class
self._local_name = local_name
self._parent_module_globals = parent_module_globals
super(LazyLoader, self).__init__(name)
def _load(self):
# Import the target module and insert it into the parent's namespace
module = importlib.import_module(self.__name__)
self._parent_module_globals[self._local_name] = module
# Update this object's dict so that if someone keeps a reference to the
# LazyLoader, lookups are efficient (__getattr__ is only called on lookups
# that fail).
self.__dict__.update(module.__dict__)
return module
def __getattr__(self, item):
module = self._load()
return getattr(module, item)
def __dir__(self):
module = self._load()
return dir(module)
class _DeHTMLParser(HTMLParser): class _DeHTMLParser(HTMLParser):
def __init__(self): def __init__(self):