Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
SimStadt
simstadtpy
Commits
0c719260
Commit
0c719260
authored
Jul 18, 2026
by
Eric Duminil
Browse files
Allow params for regionchooser
parent
dd949c28
Changes
4
Hide whitespace changes
Inline
Side-by-side
pyproject.toml
View file @
0c719260
...
...
@@ -17,7 +17,7 @@ dependencies = [
[project.scripts]
simstadt
=
"simstadt:main"
regionchooser
=
"simstadt:
run_
regionchooser"
regionchooser
=
"simstadt:regionchooser
_app
"
[dependency-groups]
dev
=
["pytest>
=
8.0
", "
rich
", "
pytest-cov
"]
...
...
src/simstadt/__init__.py
View file @
0c719260
...
...
@@ -34,9 +34,18 @@ __all__ = [
"photovoltaic_simulation"
,
"run_regionchooser"
,
"run_workflow_with_citygml"
,
"main"
,
"regionchooser_app"
,
]
def
main
()
->
None
:
from
.cli
import
app
app
()
from
.cli
import
simstadt_app
simstadt_app
()
def
regionchooser_app
()
->
None
:
from
.cli
import
regionchooser_app
as
_regionchooser_app
_regionchooser_app
()
src/simstadt/cli.py
View file @
0c719260
...
...
@@ -6,12 +6,19 @@ import re
import
subprocess
import
sys
from
pathlib
import
Path
from
.install
import
cmd_install
from
.runner
import
run_regionchooser
from
.utils
import
chdir
def
cmd_info
(
args
:
argparse
.
Namespace
)
->
None
:
from
.runner
import
get_simstadt_folder
,
get_simstadt_output
,
_simstadt_script
,
SIMSTADT_VERSION_FORMAT
from
.runner
import
(
SIMSTADT_VERSION_FORMAT
,
_simstadt_script
,
get_simstadt_folder
,
get_simstadt_output
,
)
try
:
folder
=
get_simstadt_folder
()
...
...
@@ -35,7 +42,9 @@ def cmd_info(args: argparse.Namespace) -> None:
if
m
:
version
,
branch
,
commit
,
date
=
m
.
groups
()
yyyy
,
mm
,
dd
=
date
[:
4
],
date
[
4
:
6
],
date
[
6
:
8
]
print
(
f
"SimStadt version:
{
version
}
(branch:
{
branch
}
, rev:
{
commit
}
, date:
{
yyyy
}
-
{
mm
}
-
{
dd
}
)"
)
print
(
f
"SimStadt version:
{
version
}
(branch:
{
branch
}
, rev:
{
commit
}
, date:
{
yyyy
}
-
{
mm
}
-
{
dd
}
)"
)
else
:
print
(
"SimStadt version: unknown (could not parse version string)"
)
...
...
@@ -83,19 +92,49 @@ def build_parser() -> argparse.ArgumentParser:
description
=
"simstadt - Python library for SimStadt workflows."
,
)
parser
.
add_argument
(
"--gui"
,
action
=
"store_true"
,
help
=
"Launch the SimStadt GUI."
)
parser
.
add_argument
(
"--install"
,
action
=
"store_true"
,
help
=
"Download and install the latest SimStadt release to ~/Desktop."
)
parser
.
add_argument
(
"template"
,
nargs
=
"?"
,
help
=
"Template name (from SIMSTADT_TEMPLATE_PATH) or path to a .flow directory."
)
parser
.
add_argument
(
"citygml"
,
nargs
=
"?"
,
type
=
Path
,
help
=
"Path to the CityGML input file."
)
parser
.
add_argument
(
"-d"
,
"--description"
,
help
=
"Human-readable label for the result."
)
parser
.
add_argument
(
"--destination"
,
help
=
"Workflow folder name (default: timestamped random id)."
)
parser
.
add_argument
(
"-p"
,
"--project-path"
,
dest
=
"project_path"
,
type
=
Path
,
help
=
"Directory where the workflow folder is created."
)
parser
.
add_argument
(
"-f"
,
"--files"
,
action
=
"store_true"
,
help
=
"Show output files after the run."
)
parser
.
add_argument
(
"-s"
,
"--save"
,
type
=
Path
,
metavar
=
"PATH"
,
help
=
"Save result DataFrame to a file (.csv or .json)."
)
parser
.
add_argument
(
"-v"
,
"--verbose"
,
action
=
"store_true"
,
help
=
"Enable debug logging."
)
parser
.
add_argument
(
"--install"
,
action
=
"store_true"
,
help
=
"Download and install the latest SimStadt release to ~/Desktop."
,
)
parser
.
add_argument
(
"template"
,
nargs
=
"?"
,
help
=
"Template name (from SIMSTADT_TEMPLATE_PATH) or path to a .flow directory."
,
)
parser
.
add_argument
(
"citygml"
,
nargs
=
"?"
,
type
=
Path
,
help
=
"Path to the CityGML input file."
)
parser
.
add_argument
(
"-d"
,
"--description"
,
help
=
"Human-readable label for the result."
)
parser
.
add_argument
(
"--destination"
,
help
=
"Workflow folder name (default: timestamped random id)."
)
parser
.
add_argument
(
"-p"
,
"--project-path"
,
dest
=
"project_path"
,
type
=
Path
,
help
=
"Directory where the workflow folder is created."
,
)
parser
.
add_argument
(
"-f"
,
"--files"
,
action
=
"store_true"
,
help
=
"Show output files after the run."
)
parser
.
add_argument
(
"-s"
,
"--save"
,
type
=
Path
,
metavar
=
"PATH"
,
help
=
"Save result DataFrame to a file (.csv or .json)."
,
)
parser
.
add_argument
(
"-v"
,
"--verbose"
,
action
=
"store_true"
,
help
=
"Enable debug logging."
)
return
parser
def
app
()
->
None
:
def
simstadt_
app
()
->
None
:
parser
=
build_parser
()
args
=
parser
.
parse_args
()
...
...
@@ -106,3 +145,14 @@ def app() -> None:
cmd_run
(
args
)
else
:
cmd_info
(
args
)
def
regionchooser_app
()
->
None
:
try
:
print
(
run_regionchooser
(
*
sys
.
argv
[
1
:]))
except
ValueError
as
e
:
print
(
f
"Error:
{
e
}
"
,
file
=
sys
.
stderr
)
raise
SystemExit
(
1
)
except
subprocess
.
CalledProcessError
as
e
:
print
(
e
.
stderr
,
file
=
sys
.
stderr
)
raise
SystemExit
(
e
.
returncode
)
tests/test_cli.py
View file @
0c719260
"""Tests for the simstadt CLI."""
import
subprocess
import
sys
from
pathlib
import
Path
import
pytest
from
simstadt.cli
import
app
,
build_parser
from
simstadt.cli
import
build_parser
,
regionchooser_app
,
simstadt_app
from
.test_runner
import
CITYGML
,
HEAT_TEMPLATE
,
PV_TEMPLATE
...
...
@@ -16,7 +17,7 @@ def run_cli(monkeypatch):
def
_run
(
capsys
,
*
args
):
monkeypatch
.
setattr
(
sys
,
"argv"
,
[
"simstadt"
,
*
[
str
(
a
)
for
a
in
args
]])
app
()
simstadt_
app
()
return
capsys
.
readouterr
()
return
_run
...
...
@@ -98,7 +99,7 @@ def test_run_error_on_stderr(monkeypatch, capsys):
monkeypatch
.
setattr
(
"simstadt.runner.run_simstadt"
,
_broken_simstadt
)
monkeypatch
.
setattr
(
sys
,
"argv"
,
[
"simstadt"
,
str
(
HEAT_TEMPLATE
),
str
(
CITYGML
)])
with
pytest
.
raises
(
SystemExit
):
app
()
simstadt_
app
()
out
,
err
=
capsys
.
readouterr
()
assert
"BOOM"
in
err
assert
out
==
""
...
...
@@ -138,3 +139,64 @@ def test_run_save_goes_to_stderr(mock_simstadt, run_cli, capsys, tmp_path):
out
,
err
=
run_cli
(
capsys
,
HEAT_TEMPLATE
,
CITYGML
,
"-p"
,
proj
,
"-s"
,
out_file
)
assert
"Saved to"
in
err
assert
"Saved to"
not
in
out
# ---------------------------------------------------------------------------
# regionchooser_app
# ---------------------------------------------------------------------------
def
test_regionchooser_get_hull
(
monkeypatch
,
capsys
):
def
_mock
(
*
params
):
assert
params
==
(
"--get-hull"
,
str
(
CITYGML
))
return
"HULL_WKT_OUTPUT
\n
"
monkeypatch
.
setattr
(
"simstadt.cli.run_regionchooser"
,
_mock
)
monkeypatch
.
setattr
(
sys
,
"argv"
,
[
"regionchooser"
,
"--get-hull"
,
str
(
CITYGML
)])
regionchooser_app
()
out
,
err
=
capsys
.
readouterr
()
assert
"HULL_WKT_OUTPUT"
in
out
assert
err
==
""
def
test_regionchooser_simstadt_not_found
(
monkeypatch
,
capsys
):
def
_mock
(
*
_params
):
raise
ValueError
(
"SimStadt not found"
)
monkeypatch
.
setattr
(
"simstadt.cli.run_regionchooser"
,
_mock
)
monkeypatch
.
setattr
(
sys
,
"argv"
,
[
"regionchooser"
,
"--get-hull"
,
str
(
CITYGML
)])
with
pytest
.
raises
(
SystemExit
)
as
exc_info
:
regionchooser_app
()
assert
exc_info
.
value
.
code
==
1
out
,
err
=
capsys
.
readouterr
()
assert
"Error: SimStadt not found"
in
err
assert
out
==
""
def
test_regionchooser_script_failure
(
monkeypatch
,
capsys
):
def
_mock
(
*
_params
):
raise
subprocess
.
CalledProcessError
(
returncode
=
2
,
cmd
=
[
"RegionChooser.sh"
],
stderr
=
"BOOM!"
)
monkeypatch
.
setattr
(
"simstadt.cli.run_regionchooser"
,
_mock
)
monkeypatch
.
setattr
(
sys
,
"argv"
,
[
"regionchooser"
,
"--get-hull"
,
str
(
CITYGML
)])
with
pytest
.
raises
(
SystemExit
)
as
exc_info
:
regionchooser_app
()
assert
exc_info
.
value
.
code
==
2
out
,
err
=
capsys
.
readouterr
()
assert
"BOOM!"
in
err
assert
out
==
""
@
pytest
.
mark
.
integration
def
test_regionchooser_get_hull_real
(
simstadt_folder
,
monkeypatch
,
capsys
):
monkeypatch
.
setattr
(
sys
,
"argv"
,
[
"regionchooser"
,
"--get-hull"
,
f
"--input=
{
CITYGML
.
as_posix
()
}
"
],
)
regionchooser_app
()
out
,
err
=
capsys
.
readouterr
()
assert
"POLYGON"
in
out
.
upper
()
assert
err
==
""
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment