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