Skip to main content

swmmrs

swmmrs for Python

Native, typed Python bindings for the Rust port of the EPA Storm Water Management Model (SWMM) solver.

swmmrs gives each Python Simulation its own solver state, supports interactive stepping and runtime control, and exposes live model objects, immutable snapshots, and statistics without a separate C-library installation.

[!NOTE] Run SWMM workloads faithfully, faster, and through a modern Python API.

The native solver passes broad regression comparisons against EPA SWMM and, among the engines in the real-world benchmarks, has the smallest result distance and fastest runtime. Python adds isolated simulations, typed model access, interactive controls, checkpoints, snapshots, statistics, and structured binary-output queries.

The solver port is complete, but swmmrs and its public APIs remain pre-release. Published results are strong parity evidence, not proof for every model or routing condition.

Why swmmrs?

The main swmmrs project is a parity-first, line-by-line Rust port of EPA SWMM. It preserves upstream behavior before pursuing refactoring or performance work. The Python package puts a typed, lifecycle-aware interface over that native solver.

Key goals:

  • isolate all mutable solver state inside each Simulation;
  • make lifecycle and invalid operations explicit;
  • support deterministic interactive and batch execution;
  • expose Python-friendly, typed object views and immutable result records;
  • allow independent simulations to run concurrently;
  • borrow the familiar, productive Python workflow pioneered by PySWMM.

With gratitude to PySWMM

swmmrs owes a substantial debt to PySWMM. PySWMM showed what an approachable, interactive Python interface to SWMM could be and made workflows such as stepping through a simulation, inspecting model objects, applying real-time controls, and collecting results feel natural in Python. Its design, documentation, examples, and years of practical use are a major inspiration for this package.

Many of the most recognizable parts of the swmmrs API deliberately borrow from PySWMM: the Simulation context manager and iterator, object collections, node and link access, step-advance workflows, and the general shape of interactive control loops. Where swmmrs feels familiar to a PySWMM user, that is usually because PySWMM established a clear and effective pattern worth following.

Thank you to the PySWMM maintainers and contributors for building and sustaining such an important tool for the SWMM community. Their work significantly lowered the barrier to programmatic SWMM modeling and provided the practical API vocabulary that informed much of swmmrs. PySWMM remains the mature, established choice for Python users who need its broader feature set, ecosystem, callback system, or binary-output tools. Please visit the PySWMM documentation and PySWMM repository to learn more, support their work, and cite the PySWMM JOSS paper when appropriate.

This influence is not a compatibility promise. swmmrs embeds a Rust port of the solver and uses a different ownership and lifecycle model; it is largely not a drop-in replacement for PySWMM. Imports, classes, callbacks, supported properties, error behavior, and output capabilities can differ. Existing PySWMM applications should expect an intentional migration rather than a package-name substitution. swmmrs is an independent project and is not affiliated with or endorsed by the PySWMM project.

Features

  • Batch execution or step-by-step simulation
  • Context-manager cleanup and typed lifecycle states
  • Configurable simulation options, dates, and supported model properties
  • Live access to rain gages, subcatchments, nodes, links, and LIDs
  • Runtime inflow, rainfall, stage, pollutant, and link-setting controls
  • Configurable Python callback cadence with step_advance() and stride()
  • Immutable hydraulic, water-quality, and statistics snapshots
  • Hotstart input and checkpoint output
  • Independent concurrent simulation owners
  • Type annotations and a py.typed marker
  • No Python runtime dependencies

Requirements

  • Python 3.11 or newer
  • A supported native wheel

Released wheels are the supported installation artifact: they include the package-private native extension and do not require Rust, a compiler, or a solver checkout. The package version documented by this repository is 0.3.0.

The release workflow builds two wheel families for Linux, macOS, and Windows on x86-64 and ARM64:

  • cp311-abi3 for regular CPython 3.11+.
  • cp314-cp314t for free-threaded CPython 3.14.

Free-threaded CPython 3.15+ release wheels (cp315-abi3.abi3t) are deferred until the ABI audit tools support Python 3.15. The abi3t build target remains available for local testing; it starts at 3.15 and cannot replace the 3.14t wheel. Free-threaded 3.13 is not supported by the current PyO3 dependency.

[!NOTE] The native solver source is private. To request access to the swmm-rs organization, email admin@swmm.rs with your GitHub username and a short description of the contribution you want to make.

Install a released wheel

Install the published wheel into a clean virtual environment:

python -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install swmmrs

For an authorized artifact-only installation, pass a downloaded wheel directly:

python -m pip install /path/to/swmmrs-0.3.0-cp311-abi3-manylinux_2_28_x86_64.whl

Quick start

Run a model to completion

Use execute() when Python does not need to inspect or modify the model during routing. It starts the run, advances to completion, ends it, writes the report when results are enabled, and closes the project.

from swmmrs import Simulation

simulation = Simulation("model.inp", "model.rpt", "model.out")
simulation.execute()

Inspect a model while it runs

Iteration starts the simulation on the first advance. Natural exhaustion leaves it in COMPLETE, where final statistics remain available; call end() before report(). The context manager finalizes an active or complete run and closes the project even if the body raises, but it does not generate the report for you.

from datetime import timedelta

from swmmrs import Simulation

records = []
with Simulation("model.inp", "model.rpt", "model.out") as simulation:
    node = simulation.nodes["J1"]
    conduit = simulation.links["C1"]
    simulation.step_advance(timedelta(minutes=5))

    for current_time in simulation:
        records.append((current_time, node.depth, conduit.flow))

    simulation.end()
    simulation.report()

step_advance() changes how often control returns to Python. Like stride(), it defaults to keyword-only strict=True: exact cadence boundaries can shorten the final routing step. Use step_advance(..., strict=False) to preserve ordinary routing steps and return at or beyond each target. step_advance(None) restores routing-step iteration, ignoring strict. It does not replace or enlarge SWMM's internal routing time step.

Apply a runtime control

Live object views can read current solver state and write supported runtime inputs. Values use the unit system configured by the model.

from datetime import timedelta

from swmmrs import Simulation

with Simulation("model.inp", "model.rpt", "model.out") as simulation:
    basin = simulation.nodes["BASIN"]
    gate = simulation.links["OUTLET_GATE"]
    simulation.step_advance(timedelta(minutes=5))

    for _ in simulation:
        if basin.depth >= 4.0:
            gate.target_setting = 1.0
        elif basin.depth <= 2.0:
            gate.target_setting = 0.0

    simulation.end()
    simulation.report()

Read binary output

OutputReader exposes immutable, typed series from a SWMM binary output. It detects a valid final trailer automatically. Family queries share the structured bulk reader and accept exact indexes or names plus optional start and end bounds:

from swmmrs.output import OutputName, OutputReader, PollutantAttribute

reader = OutputReader("model.out")
depth = reader.node_series("J1", "depth", start=0, end=12)
print(depth.selection, depth.times, depth.values)
pollutant = reader.node_series("J1", PollutantAttribute("TSS"))

If a run failed before writing the final trailer, the same OutputReader("model.out") call recovers complete records already visible on disk. reader.is_finalized is then False, run_status.code is None, and an incomplete trailing record is ignored. This is a fixed snapshot, not live tailing.

SeriesSelection has the fields element_type, element, and attribute. Names match stored bytes exactly; use bytes or OutputName for non-UTF-8 names. Pollutants must use PollutantAttribute, so a pollutant named depth never silently replaces the explicit static node-depth attribute. Results expose tuples of times and values and raise stable OutputError categories for missing or ambiguous names and attributes.

read_bulk_series(..., low_memory=False) reads one complete payload per selected period by default. Set low_memory=True to read only selected adjacent cell runs with smaller scratch memory. The same keyword is available on all four family methods; both strategies return identical structured data.

Core concepts

One owner, one project generation

A Simulation owns one isolated native SWMM project at a time. Object collections and live views belong to that project generation. They remain valid across routing advances, but become stale after close() or after open() creates a replacement generation. Using a stale view raises StaleViewError.

Do not copy, deep-copy, or pickle a Simulation. Use a separate owner for each independent model or scenario.

Lifecycle

State Meaning Typical next operation
OPEN The input is parsed and configuration can be changed. Configure, start, iterate, execute, or close.
RUNNING Routing is active. Step, stride, iterate, inspect, control, or end.
COMPLETE Manual or iterator advancement reached the model end but finalization has not run. Read final statistics, then end.
ENDED Run finalization is complete and the project remains open. Report, reconfigure, restart, or close.
FAILED A native lifecycle operation failed. Preserve the error and close.
CLOSED Native state and project files are released. Open a fresh project generation.

Choose one advancement style per run:

  • for current_time in simulation for iterator-owned stepping;
  • start() plus step() or stride() for caller-owned stepping;
  • execute() for an unattended batch run.

Do not mix iterator-owned advancement with start(), step(), stride(), or execute().

The native Simulation Owner is authoritative for path resolution and retained metadata, collision checks, checkpoint metadata, iterator cadence/exhaustion, lifecycle cleanup, canonical collection identity, related-view construction, and final public exception classification. Python retains presentation of Path, datetime, and timedelta, uncached identity-only Live Views, and context-manager body-exception precedence.

Checkpoints and branches

At a manual-step boundary, save_checkpoint(path) publishes an immutable Simulation Checkpoint. Resume it into fresh output files, import only its physical continuation state into a compatible open model, or fork the live owner without replay:

simulation.save_checkpoint("split.json")
resumed = Simulation.resume("split.json", "resumed.rpt", "resumed.out")
branch = simulation.fork("branch.rpt", "branch.out")
receiver.load_checkpoint_state("split.json")

Resume and fork create independent owners and file handles. State Load keeps the receiver's dates, inputs, statistics, and outputs.

Model objects

Collections are available directly from a simulation:

node = simulation.nodes["J1"]
link = simulation.links["C1"]
subcatchment = simulation.subcatchments["S1"]
rain_gage = simulation.rain_gages["RG1"]

IDs are case-insensitive. Collections preserve configured project order and provide by_index() where index-based access is required. Invalid IDs use normal KeyError behavior; invalid indices raise IndexError.

Configure supported static properties while the simulation is OPEN or ENDED:

from datetime import timedelta

simulation.options.update(
    report_step=timedelta(minutes=15),
    allow_ponding=True,
)
simulation.nodes["J1"].settings.full_depth = 4.5
simulation.links["C1"].settings.roughness = 0.015
simulation.subcatchments["S1"].settings.width = 250.0

AMM models use the same editable live-view pattern. Component values are detached dataclasses; replace the model's component sequence to apply changes:

from swmmrs.objects import AmmAssignment

model = simulation.amm_models["M1"]
components = list(model.components)
components[0].hot_shcf = 0.06
model.update(
    cold_temperature=25.0,
    hot_temperature=75.0,
    components=components,
)
simulation.amm_assignments = [
    AmmAssignment(simulation.nodes["J1"], model, area=1.0),
]

Temperature values use project units, component windows use hours, SHCF values use reciprocal project rain-depth units, and assignment areas use project land-area units.

Inspect simulation.unit_system and simulation.flow_units before combining model values with external data. The API does not silently convert project units to SI.

Live values, snapshots, and statistics

Use a live scalar view for a small number of current values:

depth = simulation.nodes["J1"].depth
flow = simulation.links["C1"].flow

Use a snapshot for a coherent, immutable batch acquisition:

nodes = simulation.nodes.snapshot(["J1", "J2"])
for node_id, depth, inflow in zip(
    nodes.object_ids,
    nodes.depth,
    nodes.total_inflow,
    strict=True,
):
    print(node_id, depth, inflow)

Snapshots and statistics are solver-created, immutable native PyO3 records and remain usable after the simulation closes. They cannot be constructed or mutated by callers; copy selected fields into lists or dictionaries when an editable host representation is needed. Live views do not.

Statistics are available while RUNNING and after manual or iterator advancement reaches COMPLETE. Acquire final statistics before calling end():

simulation.start(save_results=False)
while simulation.step() is not None:
    pass

continuity = simulation.statistics
node_statistics = simulation.nodes.statistics()
simulation.end()
simulation.close()

save_results=False skips report-period binary results but still permits live reads, snapshots, quality snapshots, and statistics.

Output files

swmmrs can write SWMM .rpt and .out artifacts. OutputReader detects and queries finalized or incomplete binary .out files independently of a live simulation.

Collect live values or snapshots while Python must inspect or control the advancing model. For post-run report-period analysis, pass an explicit output_path, run with save_results=True, and open the completed artifact with OutputReader.

Input, report, and output paths must be distinct. If output_path is omitted, SWMM uses a scratch output artifact and simulation.output_path is None.

Concurrent simulations

Different Simulation owners can run concurrently, and native lifecycle operations release Python while they execute. Give every run distinct report and output paths. Operations on the same owner serialize; never use several threads to advance one simulation.

Also account for SWMM Dynamic Wave worker threads. For example, four concurrent models configured with THREADS 2 can use up to eight caller-inclusive solver threads.

Errors

All package-specific exceptions inherit from SwmmError:

  • ValidationError — invalid Python arguments, values, or paths;
  • LifecycleError — an operation is invalid in the current state;
  • StaleViewError — a collection or object view belongs to an old project generation;
  • SolverError — the native solver rejected an input or operation;
  • InternalSimulationError — an unexpected binding or solver failure.

SolverError exposes code, operation, and optional detail fields:

from swmmrs import Simulation, SolverError

try:
    Simulation("model.inp", "model.rpt", "model.out").execute()
except SolverError as error:
    print(error.code, error.operation, error.detail)
    raise

Package and solver versions

The Python distribution and embedded SWMM solver have separate identities:

import swmmrs

print(swmmrs.__version__)
print(swmmrs.solver_version)
print(swmmrs.solver_build_id)

Documentation

Licensing and third-party notices

The original Python interface source is licensed under Apache-2.0. Official wheels include the separately licensed native solver under the permissive swmmrs Binary Runtime License, which allows use, modification, and redistribution of compiled artifacts for any purpose without granting access to the private solver source. The native component incorporates EPA SWMM public-domain material and MIT-licensed Open Water Analytics contributions. See LICENSE and the bundled third-party notices for licensing and attribution.

Development

With Just and uv installed, build local wheels from the repository root without changing your Python environment:

just python-debug     # Cargo dev profile; python/target/wheels/debug/
just python-release   # Optimized wheel; python/target/wheels/release/

These builds use the pinned maturin backend and locked Cargo dependencies. They require Rust and authorized access to the solver submodules. They do not install the wheel or replace an editable installation.

For an editable environment and tests, run from python/:

uv sync --locked
uv run pytest
uv run ruff check src

Rust and native-extension development requires authorized access to the private solver submodule. From the repository root, initialize all dependencies and run the workspace tests:

cd ..
git submodule update --init --recursive
cargo test --workspace --exclude swmmrs-parallel --locked --all-features

Test free-threaded Python

From the repository root:

uv run --no-project python python/tests/run_free_threaded.py
uv run --no-project python python/tests/run_free_threaded.py --python 3.15t

Each command installs the selected free-threaded CPython version with uv, builds a temporary wheel with native test-support hooks, and tests the installed wheel in an isolated environment. The default is 3.14t. The project virtual environment stays unchanged; temporary wheels are deleted.

The first check runs without forcing gil=0, so it catches an import that silently re-enables the GIL. It compares two concurrent simulation outputs against a sequential reference and checks concurrent queries on a shared OutputReader. The full Python suite then runs with -X gil=0, including independent-owner overlap, same-owner lock contention, and shared/independent output readers using both read strategies, stored dates, and the lazy time cache. Two unrelated tests remain explicitly skipped.

The release workflow runs the 3.14t suite on Linux x86-64. The optional --python 3.15t command is for local testing only, not release CI. Every production wheel also runs tests/wheel_smoke.py on its target runner, without test hooks. Independent owners can run concurrently; operations on one owner remain serialized. Callers must still sequence multi-call workflows and use distinct output paths.

To request maintainer access, email admin@swmm.rs with your GitHub username and a short description of the contribution you want to make.

Contributions should preserve upstream SWMM behavior first. Structural cleanup and performance changes come after parity can be demonstrated with tests.

Metadata

Release files for swmmrs 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for swmmrs 0.3.0
File
swmmrs-0.3.0-cp314-cp314t-win_arm64.whl CPython 3.14 CPython 3.14 free-threading Windows ARM64 Details
swmmrs-0.3.0-cp314-cp314t-win_amd64.whl CPython 3.14 CPython 3.14 free-threading Windows x86-64 Details
swmmrs-0.3.0-cp314-cp314t-manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ x86-64 Details
swmmrs-0.3.0-cp314-cp314t-manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64 Details
swmmrs-0.3.0-cp314-cp314t-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64 Details
swmmrs-0.3.0-cp314-cp314t-macosx_10_15_x86_64.whl CPython 3.14 CPython 3.14 free-threading macOS 10.15+ x86-64 Details
swmmrs-0.3.0-cp311-abi3-win_arm64.whl CPython 3.11 abi3 Windows ARM64 Details
swmmrs-0.3.0-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details
swmmrs-0.3.0-cp311-abi3-manylinux_2_28_x86_64.whl CPython 3.11 abi3 Linux glibc 2.28+ x86-64 Details
swmmrs-0.3.0-cp311-abi3-manylinux_2_28_aarch64.whl CPython 3.11 abi3 Linux glibc 2.28+ ARM64 Details
swmmrs-0.3.0-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details
swmmrs-0.3.0-cp311-abi3-macosx_10_13_x86_64.whl CPython 3.11 abi3 macOS 10.13+ x86-64 Details

Total release size: 36.2 MB

Release files / swmmrs-0.3.0-cp314-cp314t-win_arm64.whl

Download URL swmmrs-0.3.0-cp314-cp314t-win_arm64.whl
Size 3.2 MB
Tags CPython 3.14 CPython 3.14 free-threading Windows ARM64
SHA-256 checksum
How to use checksums
a09cc323190fe7ab79d89d96072b270b3b63561efa494e1529b2e8a0aa3c4984
BLAKE2b-256 checksum
How to use checksums
49a4667dc3da1f3942e6d45490d4351207ecdcd8208a21c41c3cc1533ba32a1a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.

Transparency log

Release files / swmmrs-0.3.0-cp314-cp314t-win_amd64.whl

Download URL swmmrs-0.3.0-cp314-cp314t-win_amd64.whl
Size 3.3 MB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
e1cf80db388c5d313b9608fdb25636e9a88e2c9fccd4b590514de2fe3db2a658
BLAKE2b-256 checksum
How to use checksums
a6576a4e1bfcc5061b9f84d0c1dfd91f975131bae13092ae9492ba6318d6b66e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.

Transparency log

Release files / swmmrs-0.3.0-cp314-cp314t-manylinux_2_28_x86_64.whl

Download URL swmmrs-0.3.0-cp314-cp314t-manylinux_2_28_x86_64.whl
Size 3.1 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
13d53f901d881c0f94d85a0abf1586eb354dfabfabbfe10c22ea8527fadcb4e6
BLAKE2b-256 checksum
How to use checksums
1253d1e849ca79f18b39465675549cc355f8b1ab5f8d66c76fe826a269df0d20
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.

Transparency log

Release files / swmmrs-0.3.0-cp314-cp314t-manylinux_2_28_aarch64.whl

Download URL swmmrs-0.3.0-cp314-cp314t-manylinux_2_28_aarch64.whl
Size 2.8 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
47df19771fc71b70364091e06a5d763ddda7ead9983165bfaa757bfa808fd50a
BLAKE2b-256 checksum
How to use checksums
2e527f45a83683439158819fc3e4224aba964ec9f314aeb3f6ae65cb9029532b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.

Transparency log

Release files / swmmrs-0.3.0-cp314-cp314t-macosx_11_0_arm64.whl

Download URL swmmrs-0.3.0-cp314-cp314t-macosx_11_0_arm64.whl
Size 2.7 MB
Tags CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a0debe00ed40e87928dd00c4faa2a61ff1da5846b30b7be1c410be40038664e4
BLAKE2b-256 checksum
How to use checksums
5830ca54c53f44f6ac08f37a121b59b15180ed86fbf445530a239e222eba711b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.

Transparency log

Release files / swmmrs-0.3.0-cp314-cp314t-macosx_10_15_x86_64.whl

Download URL swmmrs-0.3.0-cp314-cp314t-macosx_10_15_x86_64.whl
Size 3.0 MB
Tags CPython 3.14 CPython 3.14 free-threading macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
41fa44b674122e0e97a6a4f9b8a53ee9c5c39e00045d7320b305a1ee1d3b08c1
BLAKE2b-256 checksum
How to use checksums
6739b5f2948531159e1c5903a126bc8ccafd2963db97f08285b2a548362f0460
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.

Transparency log

Release files / swmmrs-0.3.0-cp311-abi3-win_arm64.whl

Download URL swmmrs-0.3.0-cp311-abi3-win_arm64.whl
Size 3.1 MB
Tags CPython 3.11 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
d53a956e59aed9e1b4618d290f1f315315bce059d48a168dd2b230fa5a41c5c4
BLAKE2b-256 checksum
How to use checksums
74259fa0a2b97918db8a12367aa6f638cfa6cb68671832b982034dce0299daf2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.

Transparency log

Release files / swmmrs-0.3.0-cp311-abi3-win_amd64.whl

Download URL swmmrs-0.3.0-cp311-abi3-win_amd64.whl
Size 3.3 MB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
f21c37e01b2d05e4637257f513a9eb6946d7026ee0833e116b18409433498902
BLAKE2b-256 checksum
How to use checksums
f5a00749b9bd0ceace1de05a6c1f5ec6fb5a4bf693730bf5f77a21249209db68
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.

Transparency log

Release files / swmmrs-0.3.0-cp311-abi3-manylinux_2_28_x86_64.whl

Download URL swmmrs-0.3.0-cp311-abi3-manylinux_2_28_x86_64.whl
Size 3.1 MB
Tags CPython 3.11 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
cbbda108f300e17624ea8a640856389db8c0189cb8bbcf19819481c564ca9a14
BLAKE2b-256 checksum
How to use checksums
13dc9a4a7135c5438c48d0fbc037360b66dba96ae71d00366e4d14d7424216c1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.

Transparency log

Release files / swmmrs-0.3.0-cp311-abi3-manylinux_2_28_aarch64.whl

Download URL swmmrs-0.3.0-cp311-abi3-manylinux_2_28_aarch64.whl
Size 2.8 MB
Tags CPython 3.11 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
3a73a9a37b604b30d1e15ad64762bd5e135c1979c4b95b4f8472302cd150be68
BLAKE2b-256 checksum
How to use checksums
9e41262886bd45552f5d87b7dab3c55b2dc725df91dd0db8e6dae345b2fddab8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.

Transparency log

Release files / swmmrs-0.3.0-cp311-abi3-macosx_11_0_arm64.whl

Download URL swmmrs-0.3.0-cp311-abi3-macosx_11_0_arm64.whl
Size 2.7 MB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
dbe19b0ebf73131cb556f7b550690257752a9ce679179310f5724b190fdbc2c0
BLAKE2b-256 checksum
How to use checksums
58754b7bd4d002063ca012d1b023897716e8d26b918ca217dfe1648ed0cbb8aa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.

Transparency log

Release files / swmmrs-0.3.0-cp311-abi3-macosx_10_13_x86_64.whl

Download URL swmmrs-0.3.0-cp311-abi3-macosx_10_13_x86_64.whl
Size 3.0 MB
Tags CPython 3.11 abi3 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
5bdcf851f6faada1e7e8062ff8a9dffa6b0e38cb6b77bd95195952a0c8ba1caf
BLAKE2b-256 checksum
How to use checksums
f452c02fbaada2481e533bd4179c5e68db6f7f293950f29e200d2c0b188a37c2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 14, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.0 This release

12 release files

0.2.1

6 release files

0.1.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page