Source code for nmdc_api_utilities.metadata

# -*- coding: utf-8 -*-
from nmdc_api_utilities.nmdc_search import NMDCSearch
import requests
import logging
import json
from nmdc_api_utilities.auth import NMDCAuth
from nmdc_api_utilities.decorators import requires_auth

logger = logging.getLogger(__name__)


[docs] class Metadata(NMDCSearch): """ Class to interact with the NMDC API metadata endpoints. These deal mostly with metadata management, including validation and submission. Parameters ---------- auth : NMDCAuth An instance of the NMDCAuth class for authentication. """ def __init__(self, env="prod", auth: NMDCAuth = None): self.env = env self.auth = auth or NMDCAuth() super().__init__(env=env)
[docs] def validate_json(self, json_records: list[dict] | str) -> int: """ Validates a json file using the NMDC json validate endpoint. If the validation passes, the method returns without any side effects. Parameters ---------- json_records : list[dict] | str The json records to be validated. Can be passed in as a file path or list of dictionaries. Returns ------- int The HTTP status code of the validation request. Raises ------ Exception If the validation fails. """ if isinstance(json_records, str): with open(json_records, "r") as f: data = json.load(f) else: data = json_records # Check that the term "placeholder" is not present anywhere in the json if "placeholder" in json.dumps(data): raise Exception("Placeholder values found in json!") url = f"{self.base_url}/metadata/json:validate" headers = {"accept": "application/json", "Content-Type": "application/json"} response = requests.post(url, headers=headers, json=data) if response.text != '{"result":"All Okay!"}' or response.status_code != 200: logging.error(f"Validation failed.") raise Exception( f"Validation failed with the following information:\n" f"Status Code: {response.status_code}\n" f"Response: {response.text}" ) else: logging.info("Validation passed!") return response.status_code
[docs] @requires_auth def submit_json(self, json_records: list[dict] | str) -> int: """ Submits a json file to the NMDC API metadata. Parameters ---------- json_records : list[dict] | str The json records to be submitted. Can be passed in as a file path or list of dictionaries. Returns ------- int The HTTP status code of the submission request. Raises ------ Exception If the submission fails. """ # if a file is passed in, load the json if isinstance(json_records, str): with open(json_records, "r") as f: json_records = json.load(f) token = self.auth.get_token() # api request url = f"{self.base_url}/metadata/json:submit" headers = { "accept": "application/json", "Content-Type": "application/json", "Authorization": f"Bearer {token}", } response = requests.post(url, headers=headers, json=json_records) # error handling if response.status_code != 200: logging.error(f"Request failed with response {response.text}") raise Exception( "Submission failed with the following information:\n" f"Status Code: {response.status_code}\n" f"Response: {response.text}" ) else: logging.info("Submission passed!") return response.status_code