style: resolve the remaining ruff findings
Some checks failed
CI / lint (pull_request) Has been cancelled
CI / type (pull_request) Has been cancelled
CI / test-headless (macos-latest, 3.10) (pull_request) Has been cancelled
CI / test-headless (macos-latest, 3.11) (pull_request) Has been cancelled
CI / test-headless (macos-latest, 3.12) (pull_request) Has been cancelled
CI / test-headless (ubuntu-latest, 3.10) (pull_request) Has been cancelled
CI / test-headless (ubuntu-latest, 3.11) (pull_request) Has been cancelled
CI / test-headless (ubuntu-latest, 3.12) (pull_request) Has been cancelled
CI / test-headless (windows-latest, 3.10) (pull_request) Has been cancelled
CI / test-headless (windows-latest, 3.11) (pull_request) Has been cancelled
CI / test-headless (windows-latest, 3.12) (pull_request) Has been cancelled
CI / test-gui (pull_request) Has been cancelled
CI / test-integration (macos-latest) (pull_request) Has been cancelled
CI / test-integration (ubuntu-latest) (pull_request) Has been cancelled
CI / test-integration (windows-latest) (pull_request) Has been cancelled

Auto-fixes (UP037, UP038, F401, I001, SIM105, RUF100) plus hand-fixes:
drop the now-unused `Union` imports, annotate mutable class attributes
with ClassVar, raise ValidationError instead of blind Exception in the
zero-length test, delete two dead locals, and bind the per-iteration
grid-builder closures to their loop variables (B023).
This commit is contained in:
smillmorel 2026-09-16 13:20:36 -04:00
commit 61b850bf46
126 changed files with 359 additions and 397 deletions

View file

@ -11,7 +11,7 @@ import pytest
pytest.importorskip("openseespy")
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow
@ -25,7 +25,7 @@ def test_basic_truss_matches_opensees_tcl_reference() -> None:
a linear rescale of the Tcl model — any deviation would flag a
real solver/translation issue.
"""
from examples.basic_truss import build_basic_truss, IN_TO_M
from examples.basic_truss import IN_TO_M, build_basic_truss
proj = build_basic_truss()
runner = OpenSeesRunner(proj)
@ -45,6 +45,7 @@ def test_basic_truss_matches_opensees_tcl_reference() -> None:
def test_basic_truss_round_trips(tmp_path) -> None: # type: ignore[no-untyped-def]
"""The example project must survive save/load without any information loss."""
from examples.basic_truss import build_basic_truss
from otko.services import load_project, save_project
p = build_basic_truss()

View file

@ -9,8 +9,8 @@ import pytest
pytest.importorskip("openseespy")
from otko.services import load_project, save_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.services import load_project, save_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -8,7 +8,7 @@ import pytest
ops = pytest.importorskip("openseespy.opensees") # skip if OpenSeesPy not installed
from otko.core import ( # noqa: E402
from otko.core import (
ElasticBeamColumn,
ElasticSection,
LinearTimeSeries,
@ -20,8 +20,8 @@ from otko.core import ( # noqa: E402
Project,
StaticCase,
)
from otko.services import OpenSeesRunner, evaluate_combination # noqa: E402
from otko.services.results import StaticResults # noqa: E402
from otko.services import OpenSeesRunner, evaluate_combination
from otko.services.results import StaticResults
pytestmark = pytest.mark.slow

View file

@ -18,7 +18,7 @@ import pytest
pytest.importorskip("openseespy")
from otko.core import ( # noqa: E402
from otko.core import (
Concrete04,
FiberSection,
ForceBeamColumn,
@ -32,7 +32,7 @@ from otko.core import ( # noqa: E402
StaticCase,
UnitSystem,
)
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -11,7 +11,7 @@ import pytest
pytest.importorskip("openseespy")
from otko.core import ( # noqa: E402
from otko.core import (
ElasticUniaxial,
LinearTimeSeries,
NodalLoad,
@ -21,7 +21,7 @@ from otko.core import ( # noqa: E402
StaticCase,
TrussElement,
)
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -8,9 +8,9 @@ import pytest
pytest.importorskip("openseespy")
from otko.core import ModalCase # noqa: E402
from otko.services import load_project, save_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.core import ModalCase
from otko.services import load_project, save_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -8,9 +8,9 @@ import pytest
pytest.importorskip("openseespy")
from otko.core import ModalCase # noqa: E402
from otko.services import load_project, save_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.core import ModalCase
from otko.services import load_project, save_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -8,9 +8,9 @@ import pytest
pytest.importorskip("openseespy")
from otko.core import ModalCase, StaticCase # noqa: E402
from otko.services import load_project, save_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.core import ModalCase, StaticCase
from otko.services import load_project, save_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow
@ -29,7 +29,6 @@ def _reload(proj, tmp_path): # type: ignore[no-untyped-def]
def test_elastic_frame_gravity_reactions(tmp_path) -> None: # type: ignore[no-untyped-def]
"""ΣFy at base = total applied gravity (distributed w × beam × floors)."""
from examples.elastic_frame import (
BAY,
LOAD_F1,
LOAD_F2,
LOAD_F3,
@ -70,7 +69,6 @@ def test_elastic_frame_gravity_reactions(tmp_path) -> None: # type: ignore[no-u
def test_elastic_frame_gravity_plus_lateral_reactions(tmp_path) -> None: # type: ignore[no-untyped-def]
"""ΣFx at base must equal -(lateral applied) within PDelta tolerance."""
from examples.elastic_frame import (
BAY,
LOAD_F1,
LOAD_F2,
LOAD_F3,
@ -120,5 +118,5 @@ def test_elastic_frame_modal_periods(tmp_path) -> None: # type: ignore[no-untyp
# 0.1930, 0.1562, 0.130 s. Our solve nails these within 1.5%.
expected = [1.040, 0.3526, 0.1930, 0.1562, 0.130]
periods = [2.0 * math.pi / math.sqrt(v) for v in r.eigenvalues]
for i, (T, T_ref) in enumerate(zip(periods, expected), start=1):
assert T == pytest.approx(T_ref, rel=0.02), f"T{i} = {T:.4f} s, reference {T_ref:.4f} s"
for i, (T, T_ref) in enumerate(zip(periods, expected, strict=False), start=1):
assert pytest.approx(T_ref, rel=0.02) == T, f"T{i} = {T:.4f} s, reference {T_ref:.4f} s"

View file

@ -9,9 +9,9 @@ import pytest
pytest.importorskip("openseespy")
from otko.core import PushoverCase, TransientCase # noqa: E402
from otko.services import load_project, save_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.core import PushoverCase, TransientCase
from otko.services import load_project, save_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -9,8 +9,8 @@ import pytest
pytest.importorskip("openseespy")
from otko.services import load_project, save_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.services import load_project, save_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -9,9 +9,9 @@ import pytest
pytest.importorskip("openseespy")
from otko.core import PushoverCase, TransientCase # noqa: E402
from otko.services import load_project, save_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.core import PushoverCase, TransientCase
from otko.services import load_project, save_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -9,9 +9,9 @@ import pytest
pytest.importorskip("openseespy")
from otko.core import PushoverCase, TransientCase # noqa: E402
from otko.services import load_project, save_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.core import PushoverCase, TransientCase
from otko.services import load_project, save_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -9,9 +9,9 @@ import pytest
pytest.importorskip("openseespy")
from otko.core import PushoverCase, TransientCase # noqa: E402
from otko.services import load_project, save_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.core import PushoverCase, TransientCase
from otko.services import load_project, save_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -9,9 +9,9 @@ import pytest
pytest.importorskip("openseespy")
from otko.core import PushoverCase, TransientCase # noqa: E402
from otko.services import load_project, save_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.core import PushoverCase, TransientCase
from otko.services import load_project, save_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -9,9 +9,9 @@ import pytest
pytest.importorskip("openseespy")
from otko.core import PushoverCase, TransientCase # noqa: E402
from otko.services import load_project, save_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.core import PushoverCase, TransientCase
from otko.services import load_project, save_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -9,9 +9,9 @@ import pytest
pytest.importorskip("openseespy")
from otko.core import PushoverCase, TransientCase # noqa: E402
from otko.services import load_project, save_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.core import PushoverCase, TransientCase
from otko.services import load_project, save_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -8,13 +8,11 @@ behaviour is exercised by the Phase 9 pushover tests.
from __future__ import annotations
import math
import pytest
pytest.importorskip("openseespy")
from otko.core import ( # noqa: E402
from otko.core import (
ElasticUniaxial,
FiberSection,
LinearTimeSeries,
@ -26,7 +24,7 @@ from otko.core import ( # noqa: E402
StaticCase,
ZeroLengthSectionElement,
)
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow
@ -134,7 +132,7 @@ def test_pushover_drives_rotation_for_moment_curvature() -> None:
# Every (κ, M) point must satisfy M = E·I·κ (1 % tolerance allows
# for the ~20-fibre discretisation of the rectangular section).
for kappa, moment in zip(result.control_disp, result.base_shear):
for kappa, moment in zip(result.control_disp, result.base_shear, strict=False):
if abs(kappa) < 1e-12:
continue
expected_M = E * I * kappa

View file

@ -6,8 +6,8 @@ import pytest
pytest.importorskip("openseespy")
from otko.services import load_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.services import load_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow
@ -15,13 +15,13 @@ pytestmark = pytest.mark.slow
def test_moment_curvature_example_round_trips_and_converges(tmp_path) -> None: # type: ignore[no-untyped-def]
"""build_moment_curvature() → save → load → run → expected shape."""
from examples.moment_curvature import (
build_moment_curvature,
COL_DEPTH,
COVER,
E_STEEL,
FY,
MU,
NUM_INCR,
build_moment_curvature,
)
proj = build_moment_curvature()

View file

@ -8,7 +8,7 @@ import pytest
ops = pytest.importorskip("openseespy.opensees") # skip if OpenSeesPy not installed
from otko.core import ( # noqa: E402
from otko.core import (
ElasticBeamColumn,
ElasticSection,
LinearTimeSeries,
@ -18,7 +18,7 @@ from otko.core import ( # noqa: E402
Project,
StaticCase,
)
from otko.services import OpenSeesRunner # noqa: E402
from otko.services import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -9,8 +9,8 @@ import pytest
pytest.importorskip("openseespy")
from otko.services import load_project, save_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.services import load_project, save_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow
@ -18,9 +18,8 @@ pytestmark = pytest.mark.slow
def test_rc_frame_earthquake_runs_and_has_oscillatory_response(tmp_path) -> None: # type: ignore[no-untyped-def]
"""Synthetic ground motion produces bounded, oscillatory response."""
from examples.rc_frame_earthquake import (
build_rc_frame_earthquake,
DT,
N_PTS,
build_rc_frame_earthquake,
)
proj = build_rc_frame_earthquake()

View file

@ -6,8 +6,8 @@ import pytest
pytest.importorskip("openseespy")
from otko.services import load_project, save_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.services import load_project, save_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow
@ -22,7 +22,7 @@ def test_rc_frame_gravity_matches_opensees_reference(tmp_path) -> None: # type:
The column axial force is 180 kip compression (from the 180 kip
load stepped onto each top node).
"""
from examples.rc_frame_gravity import build_rc_frame_gravity, P_LOAD
from examples.rc_frame_gravity import P_LOAD, build_rc_frame_gravity
proj = build_rc_frame_gravity()
proj.validate_references()

View file

@ -6,8 +6,8 @@ import pytest
pytest.importorskip("openseespy")
from otko.services import load_project, save_project # noqa: E402
from otko.services.opensees_runner import OpenSeesRunner # noqa: E402
from otko.services import load_project, save_project
from otko.services.opensees_runner import OpenSeesRunner
pytestmark = pytest.mark.slow
@ -19,10 +19,11 @@ def test_rc_frame_pushover_reaches_target_with_fallback(tmp_path) -> None: # ty
AND shows expected nonlinear shape.
"""
from examples.rc_frame_pushover import (
build_rc_frame_pushover,
D_STEP,
D_TARGET,
build_rc_frame_pushover,
)
from otko.core import PushoverCase
proj = build_rc_frame_pushover()

View file

@ -23,7 +23,7 @@ import pytest
ops = pytest.importorskip("openseespy.opensees")
h5py = pytest.importorskip("h5py")
from otko.core import ( # noqa: E402
from otko.core import (
ElasticUniaxial,
ImposedSupportMotionPattern,
Node,
@ -33,7 +33,7 @@ from otko.core import ( # noqa: E402
UniformExcitationPattern,
ZeroLengthElement,
)
from otko.services import OpenSeesRunner # noqa: E402
from otko.services import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -15,16 +15,16 @@ import math
import pytest
ops = pytest.importorskip("openseespy.opensees") # noqa: F401
ops = pytest.importorskip("openseespy.opensees")
from otko.core import ( # noqa: E402
from otko.core import (
ElasticBeamColumn,
ElasticSection,
ModalCase,
Node,
Project,
)
from otko.services import OpenSeesRunner # noqa: E402
from otko.services import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -12,7 +12,7 @@ import pytest
ops = pytest.importorskip("openseespy.opensees") # skip if OpenSeesPy not installed
from otko.core import ( # noqa: E402
from otko.core import (
ElasticBeamColumn,
ElasticSection,
LinearTimeSeries,
@ -22,7 +22,7 @@ from otko.core import ( # noqa: E402
Project,
StaticCase,
)
from otko.services import OpenSeesRunner # noqa: E402
from otko.services import OpenSeesRunner
pytestmark = pytest.mark.slow

View file

@ -12,10 +12,10 @@ import math
import numpy as np
import pytest
ops = pytest.importorskip("openseespy.opensees") # noqa: F401
h5py = pytest.importorskip("h5py") # noqa: F401
ops = pytest.importorskip("openseespy.opensees")
h5py = pytest.importorskip("h5py")
from otko.core import ( # noqa: E402
from otko.core import (
ConstantTimeSeries,
ElasticBeamColumn,
ElasticSection,
@ -27,7 +27,7 @@ from otko.core import ( # noqa: E402
StaticCase,
TransientCase,
)
from otko.services import OpenSeesRunner # noqa: E402
from otko.services import OpenSeesRunner
pytestmark = pytest.mark.slow
@ -51,7 +51,6 @@ def test_sdof_free_vibration_matches_cosine(tmp_path) -> None: # type: ignore[n
# (already done), then verify dt-step Newmark integration of free
# vibration starting from a static IC.
F0 = 100.0
u0 = F0 / k
project = Project(
ndm=2,