From 3f2a2be67fbe47a1773de758021432b64991d0b3 Mon Sep 17 00:00:00 2001 From: pcain-usgs <pcain@usgs.gov> Date: Mon, 15 Mar 2021 07:47:01 -0600 Subject: [PATCH] Address comments --- geomagio/apiclient/MetadataFactory.py | 2 + geomagio/apiclient/metadata.py | 193 +++++++++++++++++--------- setup.py | 4 +- 3 files changed, 133 insertions(+), 66 deletions(-) diff --git a/geomagio/apiclient/MetadataFactory.py b/geomagio/apiclient/MetadataFactory.py index adfedcfe..8ffaead9 100644 --- a/geomagio/apiclient/MetadataFactory.py +++ b/geomagio/apiclient/MetadataFactory.py @@ -36,6 +36,8 @@ class MetadataFactory(object): metadata = parse_obj_as(Union[List[Metadata], Metadata], responses.json()) except: raise ValueError("Data not found") + if isinstance(metadata, Metadata): + metadata = [metadata] return metadata def create_metadata(self, metadata: Metadata) -> requests.Response: diff --git a/geomagio/apiclient/metadata.py b/geomagio/apiclient/metadata.py index fae26289..cfed6e7c 100644 --- a/geomagio/apiclient/metadata.py +++ b/geomagio/apiclient/metadata.py @@ -1,3 +1,4 @@ +import sys import json import os from typing import Dict, Optional @@ -11,6 +12,11 @@ from .MetadataFactory import MetadataFactory def load_metadata(input_file) -> Optional[Dict]: + if input_file is None: + return None + if input_file == "-": + data = json.loads(sys.stdin.read()) + return data try: with open(input_file, "r") as file: data = json.load(file) @@ -27,50 +33,91 @@ def create( url: str = "http://{}/ws/secure/metadata".format( os.getenv("GEOMAG_API_HOST", "127.0.0.1:8000") ), - id: Optional[int] = None, - category: Optional[MetadataCategory] = None, - starttime: Optional[str] = None, - endtime: Optional[str] = None, - created_after: Optional[str] = None, - created_before: Optional[str] = None, - network: Optional[str] = None, - station: Optional[str] = None, - channel: Optional[str] = None, - location: Optional[str] = None, - data_valid: Optional[bool] = True, - metadata_valid: Optional[bool] = True, - input_file: Optional[str] = typer.Option( + category: MetadataCategory = None, + channel: str = None, + created_after: str = None, + created_before: str = None, + data_valid: bool = True, + endtime: str = None, + id: int = None, + input_file: str = typer.Option( None, help="JSON formatted file containing non-shared metadata information", ), + location: str = None, + metadata_valid: bool = True, + network: str = None, + starttime: str = None, + station: str = None, + wrap: bool = True, ): - metadata = Metadata( - id=id, - category=category, - starttime=UTCDateTime(starttime) if starttime else None, - endtime=UTCDateTime(endtime) if endtime else None, - created_after=UTCDateTime(created_after) if created_after else None, - created_before=UTCDateTime(created_before) if created_before else None, - network=network, - station=station, - channel=channel, - location=location, - data_valid=data_valid, - metadata_valid=metadata_valid, - ) - metadata.metadata = load_metadata(input_file=input_file) + + if wrap == True: + metadata = Metadata( + id=id, + category=category, + starttime=UTCDateTime(starttime) if starttime else None, + endtime=UTCDateTime(endtime) if endtime else None, + created_after=UTCDateTime(created_after) if created_after else None, + created_before=UTCDateTime(created_before) if created_before else None, + network=network, + station=station, + channel=channel, + location=location, + data_valid=data_valid, + metadata_valid=metadata_valid, + ) + metadata.metadata = load_metadata(input_file=input_file) + elif wrap == False: + metadata_dict = load_metadata(input_file=input_file) + metadata = Metadata(**metadata_dict) response = MetadataFactory(url=url).create_metadata(metadata=metadata) + print(response.json()) return response @app.command() def delete( - id: int, url: str = "http://{}/ws/secure/metadata".format( os.getenv("GEOMAG_API_HOST", "127.0.0.1:8000") ), + category: MetadataCategory = None, + channel: str = None, + created_after: str = None, + created_before: str = None, + data_valid: bool = True, + endtime: str = None, + id: int = None, + input_file: str = typer.Option( + None, + help="JSON formatted file containing non-shared metadata information", + ), + location: str = None, + metadata_valid: bool = True, + network: str = None, + starttime: str = None, + station: str = None, ): - response = MetadataFactory(url=url).delete_metadata(metadata=Metadata(id=id)) + if input_file is not None: + metadata_dict = load_metadata(input_file=input_file) + metadata = Metadata(**metadata_dict) + else: + metadata = Metadata( + id=id, + category=category, + starttime=starttime, + endtime=endtime, + created_after=created_after, + created_before=created_before, + network=network, + station=station, + channel=channel, + location=location, + data_valid=data_valid, + metadata_valid=metadata_valid, + ) + response = MetadataFactory(url=url).delete_metadata(metadata=metadata) + print(response.json()) return response @@ -79,18 +126,19 @@ def get( url: str = "http://{}/ws/secure/metadata".format( os.getenv("GEOMAG_API_HOST", "127.0.0.1:8000") ), - id: Optional[int] = None, category: Optional[MetadataCategory] = None, - starttime: Optional[str] = None, - endtime: Optional[str] = None, + channel: Optional[str] = None, created_after: Optional[str] = None, created_before: Optional[str] = None, + data_valid: Optional[bool] = True, + endtime: Optional[str] = None, + id: Optional[int] = None, + location: Optional[str] = None, + metadata_valid: Optional[bool] = True, network: Optional[str] = None, + starttime: Optional[str] = None, station: Optional[str] = None, - channel: Optional[str] = None, - location: Optional[str] = None, - data_valid: Optional[bool] = None, - metadata_valid: Optional[bool] = None, + unwrap: bool = False, ): query = MetadataQuery( id=id, @@ -107,47 +155,64 @@ def get( metadata_valid=metadata_valid, ) metadata = MetadataFactory(url=url).get_metadata(query=query) + if unwrap: + data = [m.metadata for m in metadata] + if len(data) == 1: + print(json.dumps(data[0])) + return data[0] + print([json.dumps(d) for d in data]) + return data + if len(metadata) == 1: + print(metadata[0].json()) + return metadata[0] + print([m.json() for m in metadata]) return metadata @app.command() def update( - id: int, url: str = "http://{}/ws/secure/metadata".format( os.getenv("GEOMAG_API_HOST", "127.0.0.1:8000") ), - category: Optional[MetadataCategory] = None, - starttime: Optional[str] = None, - endtime: Optional[str] = None, - created_after: Optional[str] = None, - created_before: Optional[str] = None, - network: Optional[str] = None, - station: Optional[str] = None, - channel: Optional[str] = None, - location: Optional[str] = None, - data_valid: Optional[bool] = True, - metadata_valid: Optional[bool] = True, - input_file: Optional[str] = typer.Option( + category: MetadataCategory = None, + channel: str = None, + created_after: str = None, + created_before: str = None, + data_valid: bool = True, + endtime: str = None, + id: int = None, + input_file: str = typer.Option( None, help="JSON formatted file containing non-shared metadata information", ), + location: str = None, + metadata_valid: bool = True, + network: str = None, + starttime: str = None, + station: str = None, ): - metadata = Metadata( - id=id, - category=category, - starttime=UTCDateTime(starttime) if starttime else None, - endtime=UTCDateTime(endtime) if endtime else None, - created_after=UTCDateTime(created_after) if created_after else None, - created_before=UTCDateTime(created_before) if created_before else None, - network=network, - station=station, - channel=channel, - location=location, - data_valid=data_valid, - metadata_valid=metadata_valid, - ) + if input_file is not None: + metadata_dict = load_metadata(input_file=input_file) + metadata = Metadata(**metadata_dict) + + else: + metadata = Metadata( + id=id, + category=category, + starttime=UTCDateTime(starttime) if starttime else None, + endtime=UTCDateTime(endtime) if endtime else None, + created_after=UTCDateTime(created_after) if created_after else None, + created_before=UTCDateTime(created_before) if created_before else None, + network=network, + station=station, + channel=channel, + location=location, + data_valid=data_valid, + metadata_valid=metadata_valid, + ) metadata.metadata = load_metadata(input_file=input_file) response = MetadataFactory(url=url).update_metadata(metadata=metadata) + print(response.json()) return response diff --git a/setup.py b/setup.py index f7b05c31..a73fd11e 100644 --- a/setup.py +++ b/setup.py @@ -25,10 +25,10 @@ setuptools.setup( use_pipfile=True, entry_points={ "console_scripts": [ - "magproc-prepfiles=geomagio.processing.magproc:main", "generate-matrix=geomagio.processing.adjusted:main", - "obsrio-filter=geomagio.processing.obsrio:main", "geomag-apiclient=geomagio.apiclient.metadata:main", + "magproc-prepfiles=geomagio.processing.magproc:main", + "obsrio-filter=geomagio.processing.obsrio:main", ], }, ) -- GitLab