def json_get_toplevel_args(nlprp_request: JsonObjectType, required: bool = True) -> JsonObjectType: """ Returns the top-level arguments for a NLPRP request. Args: nlprp_request: the NLPRP request object required: are the args required? Returns: dict: the result Raises: :exc:`NlprpError` if the value is bad, or is missing and required. """ value = nlprp_request.get(NlprpKeys.ARGS) if value is None: if required: raise key_missing_error(NlprpKeys.ARGS, is_args=True) else: return {} # type: JsonArrayType if not isinstance(value, dict): mkerror( BAD_REQUEST, f"{NlprpKeys.ARGS!r} parameter not a JSON object (dictionary)") return value
def json_get_value(x: JsonValueType, key: str, default: JsonValueType = None, required: bool = False) -> JsonValueType: """ Gets an JSON value (object, array, or literal) parameter from part of the JSON request. Args: x: a JSON object (dictionary) key: the name of the key default: the default value required: is the value required? Returns: the result, or the default Raises: :exc:`NlprpError` if the value is bad, or is missing and required. """ value = x.get(key) if value is None: # missing, or "null" if required: raise key_missing_error(key) else: return default if not isinstance(value, (dict, list, str, int, float, bool)): # None is covered above mkerror(BAD_REQUEST, f"{key!r} parameter not a JSON value") return value
def json_get_object(x: JsonObjectType, key: str, required: bool = False) -> JsonObjectType: """ Gets an object (dictionary) parameter from part of the JSON request. Args: x: a JSON object (dictionary) key: the name of the key required: is the object required? Returns: list: the result, or ``{}`` if the parameter is missing and ``required == False``. Raises: :exc:`NlprpError` if the value is bad, or is missing and required. """ value = x.get(key) if value is None: # missing, or "null" if required: raise key_missing_error(key) else: return {} # type: JsonArrayType if not isinstance(value, dict): mkerror(BAD_REQUEST, f"{key!r} parameter not a JSON object (dictionary)") return value
def json_get_array_of_str(x: JsonObjectType, key: str, required: bool = False) -> List[str]: """ Gets an array of strings from part of the JSON request. Args: x: a JSON object (dictionary) key: the name of the key required: is the array required? Returns: list: the result, or ``[]`` if the parameter is missing and ``required == False``. Raises: :exc:`NlprpError` if the value is bad, or is missing and required. """ value = x.get(key) if value is None: # missing, or "null" if required: raise key_missing_error(key) else: return [] # type: JsonArrayType if not isinstance(value, list): mkerror(BAD_REQUEST, f"{key!r} parameter not a JSON array (list)") if not all(isinstance(x, str) for x in value): mkerror(BAD_REQUEST, f"Non-string value as part of {key!r}") return value
def json_get_str(x: JsonObjectType, key: str, default: str = None, required: bool = False) -> str: """ Gets a string parameter from part of the JSON request. Args: x: a JSON object (dictionary) key: the name of the key default: the default value required: is it mandatory, or can it be missing or ``null``? Returns: str: the result, or the default Raises: :exc:`NlprpError` if the value is bad, or is missing and required. """ value = x.get(key, default) if value is None: # missing, or "null" if required: raise key_missing_error(key) else: return default if not isinstance(value, str): mkerror(BAD_REQUEST, f"{key!r} parameter not string") return value
def gen_text_metadatastr(self) -> Generator[Tuple[str, str], None, None]: """ Generates text and metadata pairs from the request, with the metadata in string (serialized JSON) format. Yields: tuple: ``(text, metadata)``, as above """ try: for document in self.content: text = json_get_str(document, NKeys.TEXT, required=True) metadata = json_get_value(document, NKeys.METADATA, default=None, required=False) metadata_str = json.dumps(metadata, separators=JSON_SEPARATORS_COMPACT) yield text, metadata_str except KeyError: raise key_missing_error(key=NKeys.TEXT)