From 684271e4bbf4e1c564b1eb8c99b434a3d829a3ee Mon Sep 17 00:00:00 2001
From: pcain-usgs <pcain@usgs.gov>
Date: Thu, 11 Mar 2021 09:51:54 -0700
Subject: [PATCH] Create typer commands

---
 geomagio/api/secure/MetadataQuery.py |   5 +-
 geomagio/apiclient/__init__.py       |   4 +-
 geomagio/apiclient/metadata.py       | 146 +++++++++++++++++++--------
 3 files changed, 111 insertions(+), 44 deletions(-)

diff --git a/geomagio/api/secure/MetadataQuery.py b/geomagio/api/secure/MetadataQuery.py
index 6b30699d..f414dd47 100644
--- a/geomagio/api/secure/MetadataQuery.py
+++ b/geomagio/api/secure/MetadataQuery.py
@@ -2,6 +2,7 @@ from datetime import timezone
 
 from obspy import UTCDateTime
 from pydantic import BaseModel
+from typing import Optional
 
 from ...metadata import MetadataCategory
 from ... import pydantic_utcdatetime
@@ -18,8 +19,8 @@ class MetadataQuery(BaseModel):
     station: str = None
     channel: str = None
     location: str = None
-    data_valid: bool = None
-    metadata_valid: bool = True
+    data_valid: Optional[bool] = None
+    metadata_valid: Optional[bool] = None
 
     def datetime_dict(self, **kwargs):
         values = self.dict(**kwargs)
diff --git a/geomagio/apiclient/__init__.py b/geomagio/apiclient/__init__.py
index a2e83d71..53bb45e4 100644
--- a/geomagio/apiclient/__init__.py
+++ b/geomagio/apiclient/__init__.py
@@ -1,4 +1,4 @@
-from .metadata import client
+from .metadata import app
 from .MetadataFactory import MetadataFactory
 
-__all__ = ["client", "MetadataFactory"]
+__all__ = ["app", "MetadataFactory"]
diff --git a/geomagio/apiclient/metadata.py b/geomagio/apiclient/metadata.py
index 535c881c..fae26289 100644
--- a/geomagio/apiclient/metadata.py
+++ b/geomagio/apiclient/metadata.py
@@ -1,6 +1,6 @@
 import json
 import os
-from typing import Optional
+from typing import Dict, Optional
 
 from obspy import UTCDateTime
 import typer
@@ -10,14 +10,20 @@ from ..metadata import Metadata, MetadataCategory
 from .MetadataFactory import MetadataFactory
 
 
-def main():
-    typer.run(client)
+def load_metadata(input_file) -> Optional[Dict]:
+    try:
+        with open(input_file, "r") as file:
+            data = json.load(file)
+        return data
+    except (FileNotFoundError, TypeError):
+        return None
 
 
-def client(
-    action: str = typer.Option(
-        default="get", help="get(default), delete, create, or update"
-    ),
+app = typer.Typer()
+
+
+@app.command()
+def create(
     url: str = "http://{}/ws/secure/metadata".format(
         os.getenv("GEOMAG_API_HOST", "127.0.0.1:8000")
     ),
@@ -52,38 +58,98 @@ def client(
         data_valid=data_valid,
         metadata_valid=metadata_valid,
     )
+    metadata.metadata = load_metadata(input_file=input_file)
+    response = MetadataFactory(url=url).create_metadata(metadata=metadata)
+    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")
+    ),
+):
+    response = MetadataFactory(url=url).delete_metadata(metadata=Metadata(id=id))
+    return response
+
+
+@app.command()
+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,
+    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] = None,
+    metadata_valid: Optional[bool] = None,
+):
+    query = MetadataQuery(
+        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 = MetadataFactory(url=url).get_metadata(query=query)
+    return metadata
+
 
-    factory = MetadataFactory(url=url, token=os.getenv("GITLAB_API_TOKEN"))
-    if action == "delete":
-        response = factory.delete_metadata(metadata=metadata)
-    elif action == "get":
-        response = factory.get_metadata(
-            query=MetadataQuery(
-                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,
-            )
-        )
-    elif action in ["create", "update"]:
-        try:
-            with open(input_file, "r") as file:
-                data = json.load(file)
-        except (FileNotFoundError, TypeError):
-            data = None
-        metadata.metadata = data
-        if action == "create":
-            response = factory.create_metadata(metadata=metadata)
-        elif action == "update":
-            response = factory.update_metadata(metadata=metadata)
-    else:
-        raise ValueError("Invalid action")
+@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(
+        None,
+        help="JSON formatted file containing non-shared metadata information",
+    ),
+):
+    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)
     return response
+
+
+def main():
+    app()
-- 
GitLab