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