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)
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)}" )
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"])
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"])
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
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
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")