示例#1
0
def test_initialize_identity_file(monkeypatch, tmpdir):
    """
    This tests creates a new identities.json file in a temporary directory,
    adds an identity to it, re-reads it from disk and extracts user and
    entered password.
    """
    identity_file = Path(tmpdir / "identities.json")

    monkeypatch.setattr("getpass.getpass", lambda: "abcd")
    monkeypatch.setattr("pansat.download.accounts._IDENTITY_FILE",
                        identity_file)
    monkeypatch.setattr("pansat.download.accounts._PANSAT_SECRET", None)
    accs.parse_identity_file()

    assert (tmpdir / "identities.json").exists()

    accs.add_identity("provider", "user_name")
    user_name, password = accs.get_identity("provider")

    assert user_name == "user_name"
    assert password == "abcd"

    accs.add_identity("provider", "other_name")
    user_name, password = accs.get_identity("provider")

    assert user_name == "other_name"
    assert password == "abcd"

    accs.delete_identity("provider")
    with pytest.raises(accs.MissingProviderError):
        accs.get_identity("provider")
示例#2
0
def test_add_parse_get_identity(monkeypatch, tmpdir):
    """
    This tests creates a new identities.json file in a temporary directory,
    adds an identity to it, re-reads it from disk and extracts user and
    entered password.
    """
    monkeypatch.setattr("getpass.getpass", lambda: "abcd")
    monkeypatch.setattr("appdirs.user_config_dir", lambda x, y: tmpdir)

    import pansat.download.accounts as accs
    assert (tmpdir / "identities.json").exists()

    accs.add_identity("provider", "user_name")
    user_name, password = accs.get_identity("provider")

    assert user_name == "user_name"
    assert password == "abcd"
示例#3
0
def test_add_identity_file(monkeypatch, tmpdir):
    """
    This file tests adding a new account to an existing identities file to ensure
    that the identities file is decrypted before an account is added to it.
    """
    identity_file = Path(tmpdir / "identities.json")
    shutil.copyfile(accs._IDENTITY_FILE, identity_file)

    monkeypatch.setattr("getpass.getpass", lambda: "abcd")
    monkeypatch.setattr("pansat.download.accounts._IDENTITY_FILE",
                        identity_file)
    monkeypatch.setattr("pansat.download.accounts._PANSAT_SECRET", None)
    accs.parse_identity_file()

    assert (tmpdir / "identities.json").exists()

    accs.add_identity("provider", "user_name")
    user_name, password = accs.get_identity("provider")

    assert user_name == "user_name"
    assert password == "abcd"
示例#4
0
def download():
    """
    The function download() passes the commandline input to the respective download functions
    of the corresponding pansat.download submodules.
    """
    ################################################################
    # define helpstrings, i.e. what is shown for the --help/-h flag
    ################################################################

    helpstring_t0 = "start of time interval in ISO 8601 format (YYYY-MM-DDThh:mm:ss)"
    helpstring_t1 = "end of time interval in ISO 8601 format (YYYY-MM-DDThh:mm:ss)"
    helpstring_type = "data type (satellite/reanalysis)"
    helpstring_pm = (
        "satellite (e.g. Cloudsat)/ model (e.g ERA5)/ ground_based/ stations")
    helpstring_product = "product to download"
    helpstring_variable = "variable(s) for reanalysis/station data"
    helpstring_domain = (
        "data domain of model data in latitude and longitude, if not specified"
        +
        " a global grid is used, if specified four arguments (lat1, lat2, lon1, lon2)"
        + " are required, with lat1<lat2, lon1<lon2")
    helpstring_grid = "specifying spatial/temporal gridding of reanalysis data"
    helpstring_loc = "location of station in [lat,lon]"
    helpstring_name = "name of station"
    helpstring_add = "add account, requires arguments ``provider´´ and ``user_name´´"

    parser = argparse.ArgumentParser()

    ##############################################################################################
    # definition of flags
    ##############################################################################################
    parser.add_argument("--list",
                        action="store_true",
                        help="list available providers/products")
    parser.add_argument("--listIDs",
                        action="store_true",
                        help="list stored identities")
    parser.add_argument("--add", nargs=2, help=helpstring_add)

    parser.add_argument(
        "-t0",
        "--starttime",
        type=datetime.datetime.fromisoformat,
        help=helpstring_t0,
    )
    parser.add_argument("-t1",
                        "--endtime",
                        type=datetime.datetime.fromisoformat,
                        help=helpstring_t1)

    parser.add_argument(
        "--type",
        choices=["satellite", "reanalysis", "ground_based", "stations"],
        help=helpstring_type,
    )
    parser.add_argument("--pm", help=helpstring_pm)
    parser.add_argument("-prod", "--product", help=helpstring_product)
    parser.add_argument("-var",
                        "--variable",
                        nargs="+",
                        help=helpstring_variable)
    parser.add_argument("--grid", nargs="+", help=helpstring_grid)
    parser.add_argument("-d",
                        "--domain",
                        nargs=4,
                        type=float,
                        help=helpstring_domain)
    parser.add_argument("-loc",
                        "--location",
                        nargs=2,
                        type=float,
                        help=helpstring_loc)
    parser.add_argument("--name", help=helpstring_name)
    parser.add_argument("--recent",
                        action="store_true",
                        help="only download last month of IGRA data")
    args = parser.parse_args()

    if args.list:
        modnames = []
        package = pansat.download
        modlen = len("pansat.download.providers.")
        for importer, modname, ispkg in pkgutil.walk_packages(
                path=package.__path__,
                prefix=package.__name__ + ".",
                onerror=lambda x: None):
            if "providers." in modname and "_provider" not in modname:
                modnames.append(modname)
                print("Provider: " + str(modname[modlen:]))
                module = importlib.import_module(modname)
                products = getattr(module,
                                   str(modname[modlen:]).upper() + "_PRODUCTS")

                print("available products:")
                if isinstance(products, dict):
                    for k, v in products.items():
                        print(k, v)
                else:
                    for i in range(0, len(products)):
                        print(products[i])
        return

    if args.add:
        from pansat.download import accounts

        accounts.add_identity(args.add[0], args.add[1])
        return

    if args.listIDs:
        from pansat.download import accounts

        identities = accounts.get_identities()
        print("Identities are available for the following providers")
        for key in identities.keys():
            if key != "pansat":
                print(key)
        return

    #################################################################################
    # consistency checks to begin downloads
    #################################################################################

    if (args.starttime and not args.endtime) or (args.endtime
                                                 and not args.starttime):
        parser.error("both -t0 and -t1 need to be specified at the same time")

    if not args.pm:
        parser.error("no platform/model chosen")

    if str(args.type) == "satellite" and not args.product:
        parser.error("no satellite data product chosen")

    if str(args.type) == "reanalysis" and not args.variable:
        parser.error("no reanalysis variable chosen")

    if str(args.type) == "reanalysis" and not args.grid:
        parser.error("no grid variable for reanalysis data chosen")

    if str(args.pm) == "ncep" and len(args.grid) != 1:
        parser.error(
            "NCEP data requires exactly one argument for gridding information")

    if str(args.pm) == "ERA5" and len(args.grid) != 2:
        parser.error(
            "ERA5 data requires exactly two arguments for gridding information"
        )

    ##############################################################################################
    # loading download functions and starting download
    ##############################################################################################
    modnames = []
    package = pansat.products
    for importer, modname, ispkg in pkgutil.walk_packages(
            path=package.__path__,
            prefix=package.__name__ + ".",
            onerror=lambda x: None):
        modnames.append(modname)

    modnames.append("pansat.products.ground_based.opera")
    modnames.append("pansat.products.stations.igra")

    if "pansat.products." + str(args.type) + "." + str(args.pm) in modnames:
        module = importlib.import_module("pansat.products." + str(args.type) +
                                         "." + str(args.pm))
        if "l" + str(args.product) in dir(module):
            productfunc = getattr(module, "l" + str(args.product))
        elif str(args.product) in dir(module):
            productfunc = getattr(module, str(args.product))
        elif "ERA5Product" in dir(module):
            era_product = getattr(module, "ERA5Product")
            if not args.domain:  # without given spatial domain (global)
                productfunc = era_product(str(args.grid[0]), str(args.grid[1]),
                                          args.variable)
            else:
                productfunc = era_product(
                    str(args.grid[0]),
                    str(args.grid[1]),
                    args.variable,
                    args.domain,
                )
        elif "NCEPReanalysis" in dir(module):
            ncep_product = getattr(module, "NCEPReanalysis")
            productfunc = ncep_product(str(args.variable[0]),
                                       str(args.grid[0]))
        elif "IGRASoundings" in dir(module):
            igra_product = getattr(module, "IGRASoundings")
            if args.location:
                productfunc = igra_product(args.location)
            elif args.name:
                productfunc = igra_product(args.name)
            elif args.variable:
                productfunc = igra_product(variable=str(args.variable[0]))
            else:
                parser.error("can't download IGRA data with given arguments")
        else:
            parser.error("product " + str(args.product) + " not implemented")

    else:
        parser.error("submodule pansat.products." + str(args.type) + "." +
                     str(args.pm) + " is not implemented")

    if args.pm == "ncep":
        args.starttime = int(args.starttime.year)
        args.endtime = int(args.endtime.year)

    if args.type != "stations":
        files = productfunc.download(args.starttime, args.endtime)
    else:
        if not args.variable:
            files = productfunc.download()
        else:
            if not args.recent:
                files = productfunc.download()
            else:
                files = productfunc.download("recent")