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
7556847e
Commit
7556847e
authored
May 24, 2026
by
Eric Duminil
Browse files
Slight refactor
parent
9f123942
Changes
3
Hide whitespace changes
Inline
Side-by-side
src/simstadt/cli.py
View file @
7556847e
...
@@ -99,7 +99,7 @@ def app() -> None:
...
@@ -99,7 +99,7 @@ def app() -> None:
args
=
parser
.
parse_args
()
args
=
parser
.
parse_args
()
if
args
.
install
:
if
args
.
install
:
cmd_install
(
args
)
cmd_install
()
if
args
.
template
and
args
.
citygml
:
if
args
.
template
and
args
.
citygml
:
cmd_run
(
args
)
cmd_run
(
args
)
...
...
src/simstadt/install.py
View file @
7556847e
...
@@ -10,12 +10,11 @@ import urllib.request
...
@@ -10,12 +10,11 @@ import urllib.request
import
zipfile
import
zipfile
from
pathlib
import
Path
from
pathlib
import
Path
from
.runner
import
SIMSTADT_VERSION_FORMAT
def
_parse_simstadt_name
(
manifest
:
str
)
->
str
:
def
_parse_simstadt_name
(
manifest
:
str
)
->
str
:
m
=
re
.
search
(
m
=
re
.
search
(
f
"Implementation-Version: *
{
SIMSTADT_VERSION_FORMAT
}
"
,
manifest
)
r
"Implementation-Version:\s*(\S+)\s+\((\w+),\s*rev\.\s*(\w+),\s*(\d+)"
,
manifest
,
)
if
not
m
:
if
not
m
:
raise
ValueError
(
"Cannot parse Implementation-Version from MANIFEST.MF"
)
raise
ValueError
(
"Cannot parse Implementation-Version from MANIFEST.MF"
)
version
,
branch
,
rev
,
date
=
m
.
groups
()
version
,
branch
,
rev
,
date
=
m
.
groups
()
...
@@ -31,7 +30,7 @@ def _get_java_version() -> int | None:
...
@@ -31,7 +30,7 @@ def _get_java_version() -> int | None:
return
None
return
None
def
cmd_install
(
args
)
->
None
:
def
cmd_install
()
->
None
:
url
=
"https://simstadt.hft-stuttgart.de/download/InstallFiles/SimStadt2_latest.zip"
url
=
"https://simstadt.hft-stuttgart.de/download/InstallFiles/SimStadt2_latest.zip"
desktop
=
Path
.
home
()
/
"Desktop"
desktop
=
Path
.
home
()
/
"Desktop"
...
@@ -53,11 +52,17 @@ def cmd_install(args) -> None:
...
@@ -53,11 +52,17 @@ def cmd_install(args) -> None:
try
:
try
:
with
zipfile
.
ZipFile
(
tmp
)
as
zf
:
with
zipfile
.
ZipFile
(
tmp
)
as
zf
:
jar_entry
=
next
(
jar_entry
=
next
(
(
n
for
n
in
zf
.
namelist
()
if
re
.
match
(
r
"lib/simstadt-desktop-.*\.jar$"
,
n
)),
(
n
for
n
in
zf
.
namelist
()
if
re
.
match
(
r
"lib/simstadt-desktop-.*\.jar$"
,
n
)
),
None
,
None
,
)
)
if
not
jar_entry
:
if
not
jar_entry
:
print
(
"Error: simstadt-desktop JAR not found in ZIP"
,
file
=
sys
.
stderr
)
print
(
"Error: simstadt-desktop JAR not found in ZIP"
,
file
=
sys
.
stderr
)
raise
SystemExit
(
1
)
raise
SystemExit
(
1
)
with
zipfile
.
ZipFile
(
io
.
BytesIO
(
zf
.
read
(
jar_entry
)))
as
jar
:
with
zipfile
.
ZipFile
(
io
.
BytesIO
(
zf
.
read
(
jar_entry
)))
as
jar
:
if
"META-INF/MANIFEST.MF"
not
in
jar
.
namelist
():
if
"META-INF/MANIFEST.MF"
not
in
jar
.
namelist
():
...
@@ -78,7 +83,10 @@ def cmd_install(args) -> None:
...
@@ -78,7 +83,10 @@ def cmd_install(args) -> None:
for
member
in
zf
.
infolist
():
for
member
in
zf
.
infolist
():
member_path
=
(
dest
/
member
.
filename
).
resolve
()
member_path
=
(
dest
/
member
.
filename
).
resolve
()
if
not
member_path
.
is_relative_to
(
dest
.
resolve
()):
if
not
member_path
.
is_relative_to
(
dest
.
resolve
()):
print
(
f
"Error: ZIP contains unsafe path:
{
member
.
filename
}
"
,
file
=
sys
.
stderr
)
print
(
f
"Error: ZIP contains unsafe path:
{
member
.
filename
}
"
,
file
=
sys
.
stderr
,
)
raise
SystemExit
(
1
)
raise
SystemExit
(
1
)
zf
.
extractall
(
dest
)
zf
.
extractall
(
dest
)
for
member
in
zf
.
infolist
():
for
member
in
zf
.
infolist
():
...
@@ -98,6 +106,12 @@ def cmd_install(args) -> None:
...
@@ -98,6 +106,12 @@ def cmd_install(args) -> None:
java_version
=
_get_java_version
()
java_version
=
_get_java_version
()
if
java_version
is
None
:
if
java_version
is
None
:
print
(
"Warning: Java not found. SimStadt requires Java 17. Download: https://bell-sw.com/pages/downloads/#jdk-17-lts"
,
file
=
sys
.
stderr
)
print
(
"Warning: Java not found. SimStadt requires Java 17. Download: https://bell-sw.com/pages/downloads/#jdk-17-lts"
,
file
=
sys
.
stderr
,
)
elif
java_version
<
17
:
elif
java_version
<
17
:
print
(
f
"Warning: Java
{
java_version
}
found but SimStadt requires Java 17. Download: https://bell-sw.com/pages/downloads/#jdk-17-lts"
,
file
=
sys
.
stderr
)
print
(
f
"Warning: Java
{
java_version
}
found but SimStadt requires Java 17. Download: https://bell-sw.com/pages/downloads/#jdk-17-lts"
,
file
=
sys
.
stderr
,
)
src/simstadt/runner.py
View file @
7556847e
...
@@ -26,6 +26,7 @@ from .utils import chdir, random_id
...
@@ -26,6 +26,7 @@ from .utils import chdir, random_id
PARAMS
=
"params.xml"
PARAMS
=
"params.xml"
SIMSTADT2_GLOB
=
"SimStadt2_0.*/"
SIMSTADT2_GLOB
=
"SimStadt2_0.*/"
SIMSTADT_TEMP_REPO
=
Path
(
tempfile
.
gettempdir
())
/
"simstadt_repo"
SIMSTADT_TEMP_REPO
=
Path
(
tempfile
.
gettempdir
())
/
"simstadt_repo"
SIMSTADT_VERSION_FORMAT
=
r
"(\S+)\s*\((\w+), rev. (\w+), (\d+)\s*\)"
load_dotenv
()
load_dotenv
()
...
@@ -69,9 +70,9 @@ def get_template_path() -> Path:
...
@@ -69,9 +70,9 @@ def get_template_path() -> Path:
)
)
def
get_version_and_date
()
->
tuple
[
str
,
str
]:
def
get_version_and_date
()
->
tuple
[
str
,
str
]:
SIMSTADT_VERSION_
FORMAT
=
re
.
compile
(
r
"Launching SimStadt
(\S+) \((\w+), rev. (\w+), (\d+)\)
"
)
SIMSTADT_VERSION_
PATTERN
=
re
.
compile
(
f
"Launching SimStadt
{
SIMSTADT_VERSION_FORMAT
}
"
)
output
=
get_simstadt_output
(
get_simstadt_folder
())
output
=
get_simstadt_output
(
get_simstadt_folder
())
m
=
SIMSTADT_VERSION_
FORMAT
.
search
(
output
)
m
=
SIMSTADT_VERSION_
PATTERN
.
search
(
output
)
if
not
m
:
if
not
m
:
raise
ValueError
(
f
"No SimStadt version string found in output:
\n
{
output
}
"
)
raise
ValueError
(
f
"No SimStadt version string found in output:
\n
{
output
}
"
)
version
,
_branch
,
_commit
,
date
=
m
.
groups
()
version
,
_branch
,
_commit
,
date
=
m
.
groups
()
...
...
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