Skip to content

Commit

Permalink
Change cli to click
Browse files Browse the repository at this point in the history
Add support for entire wetterdienst APIs in cli and restapi
  • Loading branch information
gutzbenj committed Apr 25, 2021
1 parent 0cc2a4a commit 0375a41
Showing 1 changed file with 145 additions and 1 deletion.
146 changes: 145 additions & 1 deletion wetterdienst/ui/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,19 @@
# Distributed under the MIT License. See LICENSE for more info.
import json
import logging
import pprint
import sys
from enum import Enum
from pprint import pformat

import pandas as pd
import typer
from docopt import DocoptExit, docopt
from munch import Munch
import click

from wetterdienst import __appname__, __version__
from wetterdienst import __appname__, __version__, Provider, Wetterdienst, Kind
from wetterdienst.exceptions import ProviderError
from wetterdienst.provider.dwd.forecast import DwdMosmixRequest, DwdMosmixType
from wetterdienst.provider.dwd.observation import (
DwdObservationDataset,
Expand All @@ -25,6 +30,141 @@
log = logging.getLogger(__name__)


appname = f"{__appname__} {__version__}"


@click.group()
@click.option('--debug/--no-debug', default=False)
def wetterdienst(debug):
log_level = logging.INFO

if debug: # pragma: no cover
log_level = logging.DEBUG

setup_logging(log_level)


@wetterdienst.command("restapi")
@click.option("--listen", type=click.STRING, default=None)
@click.option("--reload", type=click.BOOL, default=False)
def restapi(listen: str, reload: bool):
# Run HTTP service.
log.info(f"Starting {appname}")
log.info(f"Starting HTTP web service on http://{listen}")
from wetterdienst.ui.restapi import start_service

start_service(listen, reload=reload)
return


@wetterdienst.command("explorer")
@click.option("--listen", type=click.STRING, default=None)
@click.option("--reload", type=click.BOOL, default=False)
def explorer(listen: str = None, reload: bool = False):
log.info(f"Starting {appname}")
log.info(f"Starting Explorer web service on http://{listen}")
from wetterdienst.ui.explorer.app import start_service

start_service(listen, reload=reload)
return


def _provider(provider: str, kind: str):
try:
API = Wetterdienst(provider, kind)
except ProviderError as e:
click.Abort(e.str)

return API


@wetterdienst.group()
@click.argument("provider", type=click.Choice(list(map(lambda p: p.name, Provider)), case_sensitive=False))
@click.argument("kind", type=click.Choice(list(map(lambda k: k.name, Kind)), case_sensitive=False))
@click.pass_context
def scalar(ctx, provider: str, kind: str):
ctx.obj = {
"provider": provider,
"kind": kind
}


@scalar.command()
@click.pass_context
def about(
ctx
# # coverage: bool = False,
# # fields: bool = False
):
def output(thing):
for item in thing:
if item:
if hasattr(item, "value"):
value = item.value
else:
value = item
print("-", value)

API = _provider(ctx.obj.get("provider"), ctx.obj.get("kind"))

print(API.__name__)

# if options.parameters:
# output(DwdObservationDataset)
#
# elif options.resolutions:
# output(DwdObservationResolution)
#
# elif options.periods:
# output(DwdObservationPeriod)
#
# if coverage:
# metadata = API.discover(
# # filter_=options.resolution,
# # dataset=read_list(options.parameter),
# flatten=False,
# )
# print(metadata)
#
#
# elif API.provider == Provider.DWD and fields:
# metadata = DwdObservationRequest.describe_fields(
# dataset=read_list(options.parameter),
# resolution=options.resolution,
# period=read_list(options.period),
# language=options.language,
# )
# output = pformat(dict(metadata))
# print(output)
#
# else:
# log.error(
# 'Please invoke "wetterdienst dwd about" with one of these subcommands:'
# )
# output(["parameters", "resolutions", "periods", "coverage"])
# sys.exit(1)
return


#@app.command("radar")
def radar(dwd: bool = False, odim_code: str = False, wmo_code: str = False, country_name: str = False):
if dwd:
data = DwdRadarSites().all()
else:
if odim_code:
data = OperaRadarSites().by_odimcode(odim_code)
elif wmo_code:
data = OperaRadarSites().by_wmocode(wmo_code)
elif country_name:
data = OperaRadarSites().by_countryname(country_name)
else:
data = OperaRadarSites().all()

output = json.dumps(data, indent=4)
print(output)
return


def run():
"""
Usage:
Expand Down Expand Up @@ -442,3 +582,7 @@ def output(thing):
)
output(["parameters", "resolutions", "periods", "coverage"])
sys.exit(1)


if __name__ == "__main__":
wetterdienst()

0 comments on commit 0375a41

Please sign in to comment.