def __init__(self, config: Optional[Union[helper_config.ConfigResolver, Dict]] = None): if not config: # If there is not config specified, we load a non-interactive configuration. self.config = helper_config.non_interactive_config_resolver() elif not isinstance(config, helper_config.ConfigResolver): # If config is not a ConfigResolver, we are in a legacy situation. # We protect this part of the Client API. self.config = helper_config.legacy_config_resolver(config) else: self.config = config # Validate configuration self._validate_config() runtime_config = {} # Process domain, strip subdomain try: domain_extractor = tldextract.TLDExtract( cache_dir=_get_tldextract_cache_path(), include_psl_private_domains=True) except TypeError: domain_extractor = tldextract.TLDExtract( cache_file=_get_tldextract_cache_path(), include_psl_private_domains=True # type: ignore ) domain_parts = domain_extractor(self.config.resolve("lexicon:domain")) runtime_config[ "domain"] = f"{domain_parts.domain}.{domain_parts.suffix}" delegated = self.config.resolve("lexicon:delegated") if delegated: # handle delegated domain delegated = str(delegated).rstrip(".") initial_domain = str(runtime_config.get("domain")) if delegated != initial_domain: # convert to relative name if delegated.endswith(initial_domain): delegated = delegated[:-len(initial_domain)] delegated = delegated.rstrip(".") # update domain runtime_config["domain"] = f"{delegated}.{initial_domain}" self.action = self.config.resolve("lexicon:action") self.provider_name = self.config.resolve( "lexicon:provider_name") or self.config.resolve("lexicon:provider") if not self.provider_name: raise ValueError("Could not resolve provider name.") self.config.add_config_source( helper_config.DictConfigSource(runtime_config), 0) provider_module = importlib.import_module("lexicon.providers." + self.provider_name) provider_class: Type[Provider] = getattr(provider_module, "Provider") self.provider = provider_class(self.config)
def __init__(self, config): if not isinstance(config, ConfigResolver): # If config is a plain dict, we are in a legacy situation. # To protect the Provider API, the legacy dict is handled in a # correctly defined ConfigResolver. self.config = legacy_config_resolver(config) else: self.config = config self.domain = config.resolve('lexicon:domain') self.proxy_provider = None
def __init__(self, config): if not isinstance(config, ConfigResolver): # If config is a plain dict, we are in a legacy situation. # To protect the Provider API, the legacy dict is handled in a # correctly defined ConfigResolver. self.config = legacy_config_resolver(config) else: self.config = config # Default ttl self.config.with_dict({'ttl': 3600}) self.provider_name = self.config.resolve('lexicon:provider_name') or self.config.resolve('lexicon:provider') self.domain = self.config.resolve('lexicon:domain') self.domain_id = None
def __init__(self, config=None): if not config: # If there is not config specified, we load a non-interactive configuration. self.config = non_interactive_config_resolver() elif not isinstance(config, ConfigResolver): # If config is not a ConfigResolver, we are in a legacy situation. # We protect this part of the Client API. self.config = legacy_config_resolver(config) else: self.config = config # Validate configuration self._validate_config() runtime_config = {} # Process domain, strip subdomain domain_extractor = tldextract.TLDExtract(cache_file=TLDEXTRACT_CACHE_FILE, include_psl_private_domains=True) domain_parts = domain_extractor( self.config.resolve('lexicon:domain')) runtime_config['domain'] = '{0}.{1}'.format( domain_parts.domain, domain_parts.suffix) if self.config.resolve('lexicon:delegated'): # handle delegated domain delegated = self.config.resolve('lexicon:delegated').rstrip('.') if delegated != runtime_config.get('domain'): # convert to relative name if delegated.endswith(runtime_config.get('domain')): delegated = delegated[:-len(runtime_config.get('domain'))] delegated = delegated.rstrip('.') # update domain runtime_config['domain'] = '{0}.{1}'.format( delegated, runtime_config.get('domain')) self.action = self.config.resolve('lexicon:action') self.provider_name = (self.config.resolve('lexicon:provider_name') or self.config.resolve('lexicon:provider')) self.config.add_config_source(DictConfigSource(runtime_config), 0) provider_module = importlib.import_module( 'lexicon.providers.' + self.provider_name) provider_class = getattr(provider_module, 'Provider') self.provider = provider_class(self.config)
def __init__(self, config=None): if not config: # If there is not config specified, we load a non-interactive configuration. self.config = helper_config.non_interactive_config_resolver() elif not isinstance(config, helper_config.ConfigResolver): # If config is not a ConfigResolver, we are in a legacy situation. # We protect this part of the Client API. self.config = helper_config.legacy_config_resolver(config) else: self.config = config # Validate configuration self._validate_config() runtime_config = {} # Process domain, strip subdomain domain_extractor = tldextract.TLDExtract( cache_file=TLDEXTRACT_CACHE_FILE, include_psl_private_domains=True ) domain_parts = domain_extractor(self.config.resolve("lexicon:domain")) runtime_config["domain"] = f"{domain_parts.domain}.{domain_parts.suffix}" if self.config.resolve("lexicon:delegated"): # handle delegated domain delegated = self.config.resolve("lexicon:delegated").rstrip(".") if delegated != runtime_config.get("domain"): # convert to relative name if delegated.endswith(runtime_config.get("domain")): delegated = delegated[: -len(runtime_config.get("domain"))] delegated = delegated.rstrip(".") # update domain runtime_config["domain"] = f"{delegated}.{runtime_config.get('domain')}" self.action = self.config.resolve("lexicon:action") self.provider_name = self.config.resolve( "lexicon:provider_name" ) or self.config.resolve("lexicon:provider") self.config.add_config_source(helper_config.DictConfigSource(runtime_config), 0) provider_module = importlib.import_module( "lexicon.providers." + self.provider_name ) provider_class = getattr(provider_module, "Provider") self.provider = provider_class(self.config)
def __init__(self, config): if not isinstance(config, ConfigResolver): # If config is a plain dict, we are in a legacy situation. # To protect the Provider API, the legacy dict is handled in a # correctly defined ConfigResolver. # Also, there may be some situation where `provider` key is not set in the config. # It should not happen when Lexicon is called from Client, as it will set itself # this key. However there were no automated logic if the Provider is used directly. # So we provide this logic here. if not config.get('provider_name') and not config.get('provider'): config['provider_name'] = __name__ # Obviously we use the module name itself. self.config = legacy_config_resolver(config) else: self.config = config # Default ttl self.config.with_dict({'ttl': 3600}) self.provider_name = self.config.resolve( 'lexicon:provider_name') or self.config.resolve('lexicon:provider') self.domain = self.config.resolve('lexicon:domain') self.domain_id = None