Skip to content

Maintenance update#12

Open
ClaasRostock wants to merge 139 commits intomainfrom
maintenance-update
Open

Maintenance update#12
ClaasRostock wants to merge 139 commits intomainfrom
maintenance-update

Conversation

@ClaasRostock
Copy link
Collaborator

@ClaasRostock ClaasRostock commented Feb 20, 2026

Maintenance update, repaired tests, bumped version number to 0.3.0 (as preparation for release)

Resolved

  • src/sim_explorer/init.py: Added import libcosimpy.CosimLibrary in __init__.py on package root level. This to make sure the libcosimc dll gets loaded only once. This resolves a runtime error observed with libcosimpy. (Although the root bug is likely in libcosimpy; should be reviewed by the libcosimpy team).

Added

  • Added a new module codegen.py in sub-package utils, defining a helper function get_callable_function():
    • get_callable_function() executes compiled code in explicit namespaces, retrieves a named function, validates it is callable, and eventually returns the created function.
    • Refactored class Assertion in module assertion.py to use the new helper function get_callable_function(). That way, the code in Assertion no longer relies on mutating locals(), which is known to be unreliable and can cause hard-to-track side effects.
    • Updated the related tests in tests/test_assertion.py.

Removed

  • Removed qa.bat
  • Removed __init__.py files in /tests

Changed

  • GitHub Workflows:
    • _test_future.yml: Updated Python version in test_future to 3.15.0-alpha - 3.15.0
    • _test.yml: Updated Python versions in test matrix to 3.11, 3.12, 3.13, 3.14
    • Added 'name: Checkout code' to uses of 'actions/checkout', for better readability and consistency across workflow files.
    • Added 'name: Download build artifacts' to uses of 'actions/download-artifact', for better readability and consistency across workflow files.
    • Added 'name: Publish to PyPI' to uses of 'pypa/gh-action-pypi-publish', for better readability and consistency across workflow files.
    • Added 'name: Upload build artifacts' to uses of 'actions/upload-artifact', for better readability and consistency across workflow files.
    • Changed 'uv sync --upgrade' to 'uv sync -U'
    • Ensured that actions 'upload-artifact' and 'download-artifact' uniformly specify 'dist' as (file)name for the artifact uploaded (or downloaded, respectively), for consistency across workflow files.
    • pull_request_to_main.yml and nightly_build.yml: Added 'workflow_dispatch:' in selected workflows to allow manual trigger of the workflow.
    • Removed redundant 'Set up Python' steps (no longer needed, as 'uv sync' will automatically install Python if not present).
    • Replaced 'Build source distribution and wheel' with 'Build source distribution and wheels' (plural) in workflow step names.
    • Replaced 'Run twine check' with 'Check build artifacts' in workflow step names, to better reflect the purpose of the step.
    • Updated the syntax used for the OS and Python matrix in test workflows.
    • Added --extra test to the workflows running tests, as the test workflows will need these additional dependencies to run the FMUs in /tests/data/..
  • pyproject.toml:
    • Added required-environments to uv.tools (windows, linux)
    • Removed deprecated mypy plugin 'numpy.typing.mypy_plugin'
    • Removed deprecated pyright setting 'reportShadowedImports'
    • Removed leading carets and trailing slashes from 'exclude' paths
    • Removed trailing slashes from 'exclude' paths
    • Updated supported Python versions to 3.11, 3.12, 3.13, 3.14
    • Removed upper version constraint from required Python version, i.e. changed the "requires-python" field from ">= 3.11, < 3.15" to ">= 3.11".

      Detailed background and reasoning in this good yet long post by Henry Schreiner:
      https://iscinumpy.dev/post/bound-version-constraints/#pinning-the-python-version-is-special

      TLDR: Placing an upper Python version constraint on a Python package causes more harm than it provides benefits.
      The upper version constraint unnecessarily manifests incompatibility with future Python releases.
      Removing the upper version constraint ensures the package remains installable as Python evolves.
      In the majority of cases, the newer Python version will anyhow be backward-compatible. And in the rare case where your package would really not work with a newer Python version,
      users can at least find a solution manually to resolve the conflict, e.g. by pinning your package to the last version compatible with the environment they install it in.
      That way, we ensure it remains possible for users to find a solution, instead of rendering it impossible forever.
    • Added scipy>=1.16 to optional dependency group 'test', as TimeTableFMU.fmu requires scipy to be installed in the calling environment.
  • Sphinx Documentation:
    • Sphinx conf.py: Removed ruff rule exception on file level
    • Sphinx conf.py: Updated year in copyright statement to 2026
  • VS Code Settings:
    • Recommended extensions:
      • Removed 'njqdev.vscode-python-typehint' (Python Type Hint). Not maintained since 1 year, and the functionality is now covered by GitHub Copilot.
      • Added 'ms-python.debugpy' (Python Debugger).
      • Added 'ms-python.vscode-python-envs' (Python Environments).
      • Removed deprecated IntelliCode extension and replaced it by GitHub Copilot Chat as recommended replacement.
    • Updated 'mypy-type-checker.reportingScope' to 'custom'.
  • .pre-commit-config.yaml: Updated id of ruff to ruff-check
  • .sourcery.yaml: Updated the lowest Python version the project supports to '3.11'
  • ruff.toml: Updated target Python version to "py311"

Tests

  • tests/data/BouncingBall3D: Updated BouncingBall3D.fmu and related tests.
  • tests/data/MobileCrane: Updated MobileCrane.fmu and related tests.
  • tests/data/Oscillator: Updated HarmonicOscillator.fmu
  • Renamed folder tests/data/SimpleTable to tests/data/TimeTable
  • Replaced SimpleTable.fmu with TimeTableFMU.fmu (in folder tests/data/TimeTable)
  • tests/conftest.py:
    • Changed scope of top level fixtures from "package" to "session", because "session" scoped fixtures gets called before "package" scoped fixtures
    • Changed the additional pytest command line option --show from an input option (requesting the user to pass a literal value, e.g. write --show True or --show False ) to a command line switch. This eases the usage of this additional command line option. The pytest fixture show now gets set to True by simply adding the switch --show on the commandline. No need anylonger to amend --show with an additional string literal True or False. Passing the switch --show sets fixture show to True; omitting it sets fixture show to False.
  • Repaired all failing tests

Dependencies

  • Updated to docutils>=0.22.4
  • Updated to furo>=2025.12
  • Updated to jupyter>=1.1.1
  • Updated to libcosimpy>=0.0.5
  • Updated to mypy>=1.19.1
  • Updated to myst-parser>=5.0
  • Updated to numpy>=2.3 (removed split version specifiers)
  • Updated to plotly>=6.5
  • Updated to pre-commit>=4.5
  • Updated to pydantic>=2.12
  • Updated to pyright>=1.1.408
  • Updated to pytest-cov>=7.0
  • Updated to pytest>=9.0
  • Updated to ruff>=0.15.1
  • Updated to sourcery>=1.43.0
  • Updated to sphinx>=9.0
  • Updated to sphinx-argparse-cli>=1.20.1
  • Updated to sphinx-autodoc-typehints>=3.6
  • Updated to sphinxcontrib-mermaid>=2.0
  • Updated to sympy>=1.14.0
  • .pre-commit-config.yaml:
    • Updated rev of pre-commit-hooks to v6.0.0
    • Updated rev of ruff-pre-commit to v0.15.1
  • GitHub Workflows:
    • Updated 'checkout' action to v5
    • Updated 'download-artifact' action to v5
    • Updated 'setup-uv' action to v7
    • Updated 'upload-artifact' action to v5

…c' will automatically install Python if not present).
…c' will automatically install Python if not present).
… readability and consistency across workflow files.
…act', for better readability and consistency across workflow files.
…rtifact', for better readability and consistency across workflow files.
…mly specify 'dist' as (file)name for the artifact uploaded (or downloaded, respectively), for consistency across workflow files.
…tep names, to better reflect the purpose of the step.
…tribution and wheels' (plural) in workflow step names.
…', for better readability and consistency across workflow files.
…tch:' in selected workflows to allow manual trigger of the workflow.
…hanged the "requires-python" field from ">= 3.11, < 3.15" to ">= 3.11". <br>

    Detailed background and reasoning in this good yet long post by Henry Schreiner:
    https://iscinumpy.dev/post/bound-version-constraints/#pinning-the-python-version-is-special <br>
    TLDR: Placing an upper Python version constraint on a Python package causes more harm than it provides benefits.
    The upper version constraint unnecessarily manifests incompatibility with future Python releases.
    Removing the upper version constraint ensures the package remains installable as Python evolves.
    In the majority of cases, the newer Python version will anyhow be backward-compatible. And in the rare case where your package would really not work with a newer Python version,
    users can at least find a solution manually to resolve the conflict, e.g. by pinning your package to the last version compatible with the environment they install it in.
    That way, we ensure it remains _possible_ for users to find a solution, instead of rendering it impossible forever.
…, as TimeTableFMU.fmu requires scipy to be installed in the calling environment.
…to "session", because "session" scoped fixtures gets called before "package" scoped fixtures.
…in `__init__.py` on package root level. This to make sure the libcosimc dll gets loaded only once. This resolves a runtime error observed with libcosimpy. (Although the root bug is likely in libcosimpy; should be reviewed by the libcosimpy team).
…, as the test workflows will need these additional dependencies to run the FMUs in /tests/data/..
…ess.run() to 'cp437' to avoid decoding errors in GitHub workflows running on Windows (the Windows runners on GitHub have a non-UTF-8 locale).
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This is a comprehensive maintenance update PR preparing for version 0.3.0 release. The PR includes significant refactoring to improve code reliability, extensive test repairs after updating FMU test fixtures, dependency updates to support Python 3.11-3.14, and removal of the upper Python version constraint to follow best practices for library compatibility.

Changes:

  • Added new codegen.py utility module with get_callable_function() to safely execute compiled code without relying on mutable locals(), improving reliability
  • Updated all test data from SimpleTable to TimeTableFMU, requiring comprehensive test updates across the codebase
  • Bumped all dependencies to latest versions (numpy>=2.3, libcosimpy>=0.0.5, pytest>=9.0, etc.) and updated Python support to 3.11-3.14

Reviewed changes

Copilot reviewed 62 out of 69 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
src/sim_explorer/utils/codegen.py New utility module for safe execution of compiled code with explicit namespace management
src/sim_explorer/init.py Added libcosimpy.CosimLibrary import at package root to prevent DLL loading issues
src/sim_explorer/assertion.py Refactored to use new codegen helper, updated API signatures for eval_single/_eval methods
src/sim_explorer/case.py Updated imports (UTC from datetime), improved documentation, modernized code patterns
src/sim_explorer/system_interface.py Changed step action generation from np.arange to np.linspace, added SupportsFloat type hints
src/sim_explorer/system_interface_osp.py Minor docstring improvements and unused variable prefixing
src/sim_explorer/utils/osp.py Removed noqa comment for algorithm parameter, fixed code quality issues
src/sim_explorer/json5.py Minor code quality improvements
src/sim_explorer/cli/main.py Removed sys.path manipulation (no longer needed)
tests/*.py Extensive updates for SimpleTable->TimeTable rename, API signature changes, improved CLI testing
tests/data/TimeTable/* Renamed and updated test fixtures from SimpleTable to TimeTableFMU
tests/data/*/OspSystemStructure.xml Added Algorithm field, formatting improvements
tests/conftest.py Changed fixture scope from "package" to "session", improved file cleanup logic
pyproject.toml Version bump to 0.3.0, removed upper Python constraint, updated all dependencies
.github/workflows/* Updated actions versions, improved naming, removed redundant Python setup steps
docs/source/conf.py Updated copyright year to 2026, version to 0.3.0
README.rst Improved formatting with proper code blocks, updated instructions
CHANGELOG.md Comprehensive changelog entry for 0.3.0 release

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@ClaasRostock ClaasRostock requested a review from eisDNV February 20, 2026 20:37
…--show` from an input option (requesting the user to write `--show True` ) to a simple switch. This eases the usage of this additional commandline option. The user-defined option `show` can now be enabled by simply adding the switch `--show` on the commandline. No need anylonger to amend `--show` with the additional string literal `True`. Setting the switch `--show` sets `show` to `True`; omitting it sets `show` to `False`.
…LLY` to `Temporal.EVENTUALLY`, and adapted a related docstring in src/sim_explorer/assertion.py, to make clearer the meaning of the STL `EVENTUALLY` operator.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants