Exemplo n.º 1
0
def test_solve(ixmp_cli, test_mp):
    populate_test_platform(test_mp)
    cmd = [
        '--platform', test_mp.name, '--model', models['dantzig']['model'],
        '--scenario', models['dantzig']['scenario'], 'solve',
        '--remove-solution'
    ]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output

    # test failing solving without solution removal
    cmd = [
        '--platform', test_mp.name, '--model', models['dantzig']['model'],
        '--scenario', models['dantzig']['scenario'], 'solve'
    ]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 1, result.output

    # missing scenario
    cmd = [
        '--platform', test_mp.name, '--model', 'non-existing', '--scenario',
        models['dantzig']['scenario'], 'solve'
    ]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 1, result.output
    assert "Error: model='non-existing'" in result.output

    # no platform/scenario provided
    cmd = ['solve']
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code != 0, result.output
    assert "Error: give --url before command solve" in result.output
Exemplo n.º 2
0
def test_import_ts(ixmp_cli, test_mp, test_data_path):
    # Ensure the 'canning problem'/'standard' TimeSeries exists
    populate_test_platform(test_mp)

    # Invoke the CLI to import data to version 1 of the TimeSeries
    result = ixmp_cli.invoke([
        '--platform', test_mp.name,
        '--model', models['dantzig']['model'],
        '--scenario', models['dantzig']['scenario'],
        '--version', '1',
        'import', 'timeseries',
        '--firstyear', '2020',
        '--lastyear', '2200',
        str(test_data_path / 'timeseries_canning.csv'),
    ])
    assert result.exit_code == 0, result.output

    # Expected data
    exp = pd.DataFrame.from_dict({
        'region': ['World'],
        'variable': ['Testing'],
        'unit': ['???'],
        'year': [2020],
        'value': [28.3],
        'model': ['canning problem'],
        'scenario': ['standard'],
    })

    # The specified TimeSeries version contains the expected data
    scen = ixmp.Scenario(test_mp, **models['dantzig'], version=1)
    assert_frame_equal(scen.timeseries(variable=['Testing']), exp)

    # The data is not present in other versions
    scen = ixmp.Scenario(test_mp, **models['dantzig'], version=2)
    assert len(scen.timeseries(variable=['Testing'])) == 0
Exemplo n.º 3
0
def test_format_scenario_list(test_mp_f):
    # Use the function-scoped fixture for precise version numbers
    mp = test_mp_f
    populate_test_platform(mp)

    # Expected results

    assert [
        "",
        "Douglas Adams/",
        "  Hitchhiker#1",
        "",
        "canning problem/",
        "  standard#2  1–3",
        "",
        "2 model name(s)",
        "2 scenario name(s)",
        "2 (model, scenario) combination(s)",
        "4 total scenarios",
    ] == utils.format_scenario_list(mp)

    # With as_url=True
    assert (list(
        map(
            lambda s: s.format(mp.name),
            [
                "ixmp://{}/Douglas Adams/Hitchhiker#1",
                "ixmp://{}/canning problem/standard#2",
            ],
        )) == utils.format_scenario_list(mp, as_url=True))
Exemplo n.º 4
0
def test_format_scenario_list(test_mp):
    populate_test_platform(test_mp)

    exp = [
        '',
        'Douglas Adams/',
        '  Hitchhiker#1',
        '',
        'canning problem/',
        '  standard#2  1–3',
        '',
        '2 model name(s)',
        '2 scenario name(s)',
        '2 (model, scenario) combination(s)',
        '4 total scenarios',
    ]

    # Expected results
    assert exp == utils.format_scenario_list(test_mp)

    # With as_url=True
    exp = list(
        map(lambda s: s.format(test_mp.name), [
            'ixmp://{}/Douglas Adams/Hitchhiker#1',
            'ixmp://{}/canning problem/standard#2',
        ]))
    assert exp == utils.format_scenario_list(test_mp, as_url=True)
Exemplo n.º 5
0
def test_format_scenario_list(test_mp):
    populate_test_platform(test_mp)

    exp = [
        "",
        "Douglas Adams/",
        "  Hitchhiker#1",
        "",
        "canning problem/",
        "  standard#2  1–3",
        "",
        "2 model name(s)",
        "2 scenario name(s)",
        "2 (model, scenario) combination(s)",
        "4 total scenarios",
    ]

    # Expected results
    assert exp == utils.format_scenario_list(test_mp)

    # With as_url=True
    exp = list(
        map(
            lambda s: s.format(test_mp.name),
            [
                "ixmp://{}/Douglas Adams/Hitchhiker#1",
                "ixmp://{}/canning problem/standard#2",
            ],
        )
    )
    assert exp == utils.format_scenario_list(test_mp, as_url=True)
Exemplo n.º 6
0
def test_excel_io(ixmp_cli, test_mp, tmp_path):
    populate_test_platform(test_mp)
    tmp_path /= "dantzig.xlsx"

    url = (
        f"ixmp://{test_mp.name}/{models['dantzig']['model']}/"
        f"{models['dantzig']['scenario']}"
    )

    # Invoke the CLI to export data to Excel
    cmd = ["--url", url, "export", str(tmp_path)]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output

    # Export with a maximum row limit per sheet
    tmp_path2 = tmp_path.with_name("dantzig2.xlsx")
    cmd = cmd[:-1] + [str(tmp_path2), "--max-row", 2]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output

    # Fails without platform/scenario info
    assert ixmp_cli.invoke(cmd[2:]).exit_code == UsageError.exit_code

    # Invoke the CLI to read data from Excel
    cmd = ["--url", url, "import", "scenario", str(tmp_path)]

    # Fails without platform/scenario info
    assert ixmp_cli.invoke(cmd[2:]).exit_code == UsageError.exit_code

    # Fails without --discard-solution
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 1
    assert "This Scenario has a solution" in result.output

    # Succeeds with --discard-solution
    cmd.insert(-1, "--discard-solution")
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output

    # Import into a new model name: fails without --init-items
    cmd = [
        "--url",
        f"ixmp://{test_mp.name}/foo model/bar scenario#new",
        "import",
        "scenario",
        str(tmp_path),
    ]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 1, result.output

    # Succeeds with --init-items
    cmd.insert(-1, "--init-items")
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output

    # Import from a file that has multiple sheets (due to row limit)
    cmd[-1] = str(tmp_path2)
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output
Exemplo n.º 7
0
def test_excel_io(ixmp_cli, test_mp, tmp_path):
    populate_test_platform(test_mp)
    tmp_path /= 'dantzig.xlsx'

    # Invoke the CLI to export data to Excel
    cmd = [
        '--platform', test_mp.name,
        '--model', models['dantzig']['model'],
        '--scenario', models['dantzig']['scenario'],
        'export', str(tmp_path),
    ]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output

    # Fails without platform/scenario info
    assert ixmp_cli.invoke(cmd[6:]).exit_code == UsageError.exit_code

    # Invoke the CLI to read data from Excel
    cmd = [
        '--platform', test_mp.name,
        '--model', models['dantzig']['model'],
        '--scenario', models['dantzig']['scenario'],
        'import', 'scenario', str(tmp_path),
    ]

    # Fails without platform/scenario info
    assert ixmp_cli.invoke(cmd[6:]).exit_code == UsageError.exit_code

    # Fails without --discard-solution
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 1
    assert 'This Scenario has a solution' in result.output

    # Succeeds with --discard-solution
    cmd.insert(-1, '--discard-solution')
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output

    # Import into a new model name fails without --init-items
    cmd = [
        '--platform', test_mp.name,
        '--model', 'foo model',
        '--scenario', 'bar scenario',
        '--version', 'new',
        'import', 'scenario', str(tmp_path),
    ]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 1

    # Succeeds
    cmd.insert(-1, '--init-items')
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output
Exemplo n.º 8
0
def test_solve(ixmp_cli, test_mp):
    populate_test_platform(test_mp)
    cmd = [
        "--platform",
        test_mp.name,
        "--model",
        models["dantzig"]["model"],
        "--scenario",
        models["dantzig"]["scenario"],
        "solve",
        "--remove-solution",
    ]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output

    # test failing solving without solution removal
    cmd = [
        "--platform",
        test_mp.name,
        "--model",
        models["dantzig"]["model"],
        "--scenario",
        models["dantzig"]["scenario"],
        "solve",
    ]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 1, result.output

    # missing scenario
    cmd = [
        "--platform",
        test_mp.name,
        "--model",
        "non-existing",
        "--scenario",
        models["dantzig"]["scenario"],
        "solve",
    ]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 1, result.output
    assert "Error: model='non-existing'" in result.output

    result = ixmp_cli.invoke([f"--url=ixmp://{test_mp.name}/foo/bar", "solve"])
    assert UsageError.exit_code == result.exit_code, result.output
    assert "Error: not found" in result.output

    # no platform/scenario provided
    cmd = ["solve"]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code != 0, result.output
    assert "Error: give --url before command solve" in result.output
Exemplo n.º 9
0
def test_import_ts(ixmp_cli, test_mp, test_data_path):
    # Ensure the 'canning problem'/'standard' TimeSeries exists
    populate_test_platform(test_mp)

    # Invoke the CLI to import data to version 1 of the TimeSeries
    result = ixmp_cli.invoke(
        [
            "--platform",
            test_mp.name,
            "--model",
            models["dantzig"]["model"],
            "--scenario",
            models["dantzig"]["scenario"],
            "--version",
            "1",
            "import",
            "timeseries",
            "--firstyear",
            "2020",
            "--lastyear",
            "2200",
            str(test_data_path / "timeseries_canning.csv"),
        ]
    )
    assert result.exit_code == 0, result.output

    # Expected data
    exp = pd.DataFrame.from_dict(
        {
            "region": ["World"],
            "variable": ["Testing"],
            "unit": ["???"],
            "year": [2020],
            "value": [28.3],
            "model": ["canning problem"],
            "scenario": ["standard"],
        }
    )

    # The specified TimeSeries version contains the expected data
    scen = ixmp.Scenario(test_mp, **models["dantzig"], version=1)
    assert_frame_equal(scen.timeseries(variable=["Testing"]), exp)

    # The data is not present in other versions
    scen = ixmp.Scenario(test_mp, **models["dantzig"], version=2)
    assert len(scen.timeseries(variable=["Testing"])) == 0
Exemplo n.º 10
0
def test_excel_io_filters(ixmp_cli, test_mp, tmp_path):
    populate_test_platform(test_mp)
    tmp_path /= "dantzig.xlsx"

    url = (
        f"ixmp://{test_mp.name}/{models['dantzig']['model']}/"
        f"{models['dantzig']['scenario']}"
    )

    # Invoke the CLI to export data to Excel, with filters
    cmd = [
        "--url",
        url,
        "export",
        str(tmp_path),
        "--",
        "i=seattle",
    ]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output

    # Import into a new model name
    url = f"ixmp://{test_mp.name}/foo model/bar scenario#new"
    cmd = [
        "--url",
        url,
        "import",
        "scenario",
        "--init-items",
        str(tmp_path),
    ]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output

    # Load one of the imported parameters
    scen = ixmp.Scenario(test_mp, "foo model", "bar scenario")
    d = scen.par("d")

    # Data in (imported from) file has only filtered elements
    assert set(d["i"].unique()) == {"seattle"}
    assert len(d) == 3
Exemplo n.º 11
0
def mp(test_mp):
    """A Platform containing test data."""
    populate_test_platform(test_mp)
    yield test_mp
Exemplo n.º 12
0
def test_excel_io(ixmp_cli, test_mp, tmp_path):
    populate_test_platform(test_mp)
    tmp_path /= 'dantzig.xlsx'

    # Invoke the CLI to export data to Excel
    cmd = [
        '--platform',
        test_mp.name,
        '--model',
        models['dantzig']['model'],
        '--scenario',
        models['dantzig']['scenario'],
        'export',
        str(tmp_path),
    ]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output

    # Export with a maximum row limit per sheet
    tmp_path2 = tmp_path.with_name('dantzig2.xlsx')
    cmd = cmd[:-1] + [str(tmp_path2), '--max-row', 2]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output

    # Fails without platform/scenario info
    assert ixmp_cli.invoke(cmd[6:]).exit_code == UsageError.exit_code

    # Invoke the CLI to read data from Excel
    cmd = [
        '--platform',
        test_mp.name,
        '--model',
        models['dantzig']['model'],
        '--scenario',
        models['dantzig']['scenario'],
        'import',
        'scenario',
        str(tmp_path),
    ]

    # Fails without platform/scenario info
    assert ixmp_cli.invoke(cmd[6:]).exit_code == UsageError.exit_code

    # Fails without --discard-solution
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 1
    assert 'This Scenario has a solution' in result.output

    # Succeeds with --discard-solution
    cmd.insert(-1, '--discard-solution')
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output

    # Import into a new model name fails without --init-items
    cmd = [
        '--platform',
        test_mp.name,
        '--model',
        'foo model',
        '--scenario',
        'bar scenario',
        '--version',
        'new',
        'import',
        'scenario',
        str(tmp_path),
    ]
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 1

    # Succeeds
    cmd.insert(-1, '--init-items')
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output

    # Import from a file that has multiple sheets (due to row limit)
    cmd[cmd.index(str(tmp_path))] = str(tmp_path2)
    result = ixmp_cli.invoke(cmd)
    assert result.exit_code == 0, result.output