Ejemplo n.º 1
0
 def as_json(self,
             data: Union[Resource, List[Resource]],
             expanded: bool = False,
             store_metadata: bool = False) -> Union[Dict, List[Dict]]:
     return as_json(data, expanded, store_metadata, self._model.context(),
                    self._store.metadata_context,
                    self._model.resolve_context)
Ejemplo n.º 2
0
def collect_values(data: Union[Resource, List[Resource]],
                   follow: str,
                   exception: Callable = Exception) -> List[str]:
    def _collect(things: List) -> Iterator[str]:
        for x in things:
            if isinstance(x, Dict):
                for k, v in x.items():
                    if isinstance(v, List):
                        yield from _collect(v)
                    elif isinstance(v, Dict):
                        yield from _collect([v])
                    else:
                        yield v

    try:
        r = Reshaper("")
        reshaped = dispatch(data, r._reshape_many, r._reshape_one, [follow],
                            False)
        if reshaped is None:
            raise Exception(f"Nothing to collect")
        jsoned = as_json(reshaped, False, False, None, None, None)
        prepared = jsoned if isinstance(jsoned, List) else [jsoned]
        return list(_collect(prepared))
    except Exception as e:
        raise exception(
            f"An error occur when collecting values for path to follow '{follow}': {str(e)}"
        )
Ejemplo n.º 3
0
 def _register_one(self, resource: Resource, schema_id: str) -> None:
     data = as_json(resource, expanded=False, store_metadata=False, model_context=None,
                    metadata_context=None, context_resolver=None)
     try:
         record = self.service.create(data)
     except StoreLibrary.RecordExists:
         raise RegistrationError("resource already exists")
     else:
         resource.id = record["data"]["id"]
         resource._store_metadata = wrap_dict(record["metadata"])
Ejemplo n.º 4
0
 def _update_one(self, resource: Resource) -> None:
     data = as_json(resource, expanded=False, store_metadata=False, model_context=None,
                    metadata_context=None, context_resolver=None)
     try:
         record = self.service.update(data)
     except StoreLibrary.RecordMissing:
         raise UpdatingError("resource not found")
     except StoreLibrary.RecordDeprecated:
         raise UpdatingError("resource is deprecated")
     else:
         resource._store_metadata = wrap_dict(record["metadata"])
Ejemplo n.º 5
0
def as_dataframe(data: List[Resource], na: Union[Any, List[Any]], nesting: str, expanded: bool,
                 store_metadata: bool, model_context: Optional[Context],
                 metadata_context: Optional[Context], context_resolver: Optional[Callable]) -> DataFrame:
    dicts = as_json(data, expanded, store_metadata, model_context=model_context,
                    metadata_context=metadata_context, context_resolver=context_resolver)
    # NB: Do not use json_normalize(). It does not respect how the dictionaries are ordered.
    flattened = (flatten(x, nesting) for x in dicts)
    df = DataFrame(flattened)
    if na is not None:
        df.replace(na, np.nan, inplace=True)
    return df
Ejemplo n.º 6
0
def format_response(resource, mandatory_fields):
    json_data = as_json(resource,
                        expanded=False,
                        store_metadata=False,
                        model_context=None,
                        metadata_context=None,
                        context_resolver=None)
    for field in mandatory_fields:
        if field not in json_data:
            json_data[field] = None
    return json_data
Ejemplo n.º 7
0
def collect_values(data: Union[Resource, List[Resource]],  follow: str,
                   exception: Callable = Exception) -> List[str]:
    def _collect(things: List) -> Iterator[str]:
        for x in things:
            if isinstance(x, Dict):
                for k, v in x.items():
                    if isinstance(v, List):
                        yield from _collect(v)
                    elif isinstance(v, Dict):
                        yield from _collect([v])
                    else:
                        yield v
    try:
        r = Reshaper("")
        reshaped = dispatch(data, r._reshape_many, r._reshape_one, [follow], False)
        jsoned = as_json(reshaped, False, False, None, None, None)
        prepared = jsoned if isinstance(jsoned, List) else [jsoned]
        return list(_collect(prepared))
    except AttributeError:
        raise exception("path to follow is incorrect")