Source code for runway.lookups.handlers.random_string
"""Generate a random string."""from__future__importannotationsimportloggingimportsecretsimportstringfromtypingimportTYPE_CHECKING,Any,Callable,ClassVarfrom...utilsimportBaseModelfrom.baseimportLookupHandlerifTYPE_CHECKING:fromcollections.abcimportSequenceLOGGER=logging.getLogger(__name__)
[docs]classArgsDataModel(BaseModel):"""Arguments data model."""digits:bool=Truelowercase:bool=Truepunctuation:bool=Falseuppercase:bool=True
[docs]classRandomStringLookup(LookupHandler[Any]):"""Random string lookup."""TYPE_NAME:ClassVar[str]="random.string""""Name that the Lookup is registered as."""
[docs]@staticmethoddefcalculate_char_set(args:ArgsDataModel)->str:"""Calculate character set from the provided arguments."""char_set=""ifargs.digits:char_set+=string.digitsifargs.lowercase:char_set+=string.ascii_lowercaseifargs.punctuation:char_set+=string.punctuationifargs.uppercase:char_set+=string.ascii_uppercaseLOGGER.debug("character set: %s",char_set)returnchar_set
[docs]@staticmethoddefgenerate_random_string(char_set:Sequence[str],length:int)->str:"""Generate a random string of a set length from a set of characters."""return"".join(secrets.choice(char_set)for_inrange(length))
[docs]@staticmethoddefhas_digit(value:str)->bool:"""Check if value contains a digit."""returnany(v.isdigit()forvinvalue)
[docs]@staticmethoddefhas_lowercase(value:str)->bool:"""Check if value contains lowercase."""returnany(v.islower()forvinvalue)
[docs]@staticmethoddefhas_punctuation(value:str)->bool:"""Check if value contains uppercase."""returnany(vinstring.punctuationforvinvalue)
[docs]@staticmethoddefhas_uppercase(value:str)->bool:"""Check if value contains uppercase."""returnany(v.isupper()forvinvalue)
[docs]@classmethoddefensure_has_one_of(cls,args:ArgsDataModel,value:str)->bool:"""Ensure value has at least one of each required character. Args: args: Hook args. value: Value to check. """checks:list[Callable[[str],bool]]=[]ifargs.digits:checks.append(cls.has_digit)ifargs.lowercase:checks.append(cls.has_lowercase)ifargs.punctuation:checks.append(cls.has_punctuation)ifargs.uppercase:checks.append(cls.has_uppercase)returnsum(c(value)forcinchecks)==len(checks)
[docs]@classmethoddefhandle(cls,value:str,*_args:Any,**_kwargs:Any)->Any:"""Generate a random string. Args: value: The value passed to the Lookup. Raises: ValueError: Unable to find a value for the provided query and a default value was not provided. """raw_length,raw_args=cls.parse(value)length=int(raw_length)args=ArgsDataModel.model_validate(raw_args)char_set=cls.calculate_char_set(args)whileTrue:result=cls.generate_random_string(char_set,length)ifcls.ensure_has_one_of(args,result):breakreturncls.format_results(result,**raw_args)