Skip to main content

genja-py

Python bindings for the Genja runtime.

This package exposes the genja module, which wraps the Rust runtime and lets Python code:

  • build a runtime from hosts, a full inventory, or a settings file
  • run Python-authored tasks
  • register Python plugins
  • inspect raw and transformed inventory data

Installation

For end users, install the package with pip:

pip install genja-py

The package currently exposes the genja Python module:

import genja

Quick Start

Create a runtime from a simple host mapping:

import genja
from genja.task import Host, TaskInfo, TaskRuntimeContext, TaskSuccessResult, task


@task(name="backup_config")
class BackupTask:
    def start(
        self,
        task: TaskInfo,
        host: Host,
        context: TaskRuntimeContext,
    ) -> TaskSuccessResult:
        connection = context.connection()
        command_output = None
        if connection is not None:
            command_output = connection.execute_command("show running-config")

        return TaskSuccessResult(
            summary=f"backed up {host.hostname}",
            metadata={"show_running_config": command_output},
        )


genja = genja.Genja.from_hosts({
    "router1": {"hostname": "10.0.0.1", "platform": "ios"},
    "router2": {"hostname": "10.0.0.2", "platform": "nxos"},
}).with_runner("serial")

results = genja.run_task(BackupTask)
print(results.to_dict())

tasks = genja.Tasks()
tasks.add_task(BackupTask)

all_results = genja.run_tasks(tasks)
print([result.task_name for result in all_results])

results.to_dict() returns per-host task results with an outcome payload and separate execution_metadata for host timing and retry attempt information.

TaskRuntimeContext exposes the 1-based retry attempt through context.current_attempt and the resolved connection through context.connection() and context.has_connection(). Execution depth remains internal to the runtime.

For async Python applications, use the async entrypoints:

import asyncio
import genja
from genja.task import Host, TaskInfo, TaskRuntimeContext, TaskSuccessResult, task


@task(name="backup_config_async")
class BackupTaskAsync:
    async def start_async(
        self,
        task: TaskInfo,
        host: Host,
        context: TaskRuntimeContext,
    ) -> TaskSuccessResult:
        connection = context.connection()
        command_output = None
        if connection is not None:
            command_output = await connection.execute_command("show running-config")

        return TaskSuccessResult(
            summary=f"backed up {host.hostname}",
            metadata={"show_running_config": command_output},
        )


async def main() -> None:
    runtime = genja.Genja.from_hosts({
        "router1": {"hostname": "10.0.0.1", "platform": "ios"},
    }).with_runner("serial")

    results = await runtime.run_task_async(BackupTaskAsync)
    print(results.to_dict())


asyncio.run(main())

Use run_task_async(...) and run_tasks_async(...) when composing Genja with asyncio.gather(...) or other async application code. The synchronous run_task(...) and run_tasks(...) entrypoints remain available for scripts and non-async callers.

Python task authoring rules:

  • Define def start(...) for blocking tasks.
  • Define async def start_async(...) for async tasks.
  • Define exactly one of those methods on a @task(...) class.
  • Use sub_tasks=[ChildTask, ...] to declare child tasks.
  • Use supports_dry_run=True with dry_run(...) or dry_run_async(...) when operators should be able to preview a task.
  • Use idempotency=IdempotencyMode.CHECK or idempotency=IdempotencyMode.CHECK_AND_VERIFY with check(...) or check_async(...) when the task can inspect whether a host is already in the desired state.
  • Use session_verification=SessionVerificationConfig(...) with connection_plugin_name when a changed task should prove that a new authenticated management session can be established after the change.
from genja.task import (
    Host,
    IdempotencyCheckResult,
    IdempotencyMode,
    TaskInfo,
    TaskRuntimeContext,
    TaskSuccessResult,
    task,
)


@task(name="ensure_ntp", idempotency=IdempotencyMode.CHECK)
class EnsureNtp:
    def check(
        self,
        task: TaskInfo,
        host: Host,
        context: TaskRuntimeContext,
    ) -> IdempotencyCheckResult:
        return IdempotencyCheckResult.change_required(diff="+ntp server 192.0.2.10")

    def start(
        self,
        task: TaskInfo,
        host: Host,
        context: TaskRuntimeContext,
    ) -> TaskSuccessResult:
        return TaskSuccessResult(changed=True, summary="configured NTP")

Dry-run dispatch does not automatically run idempotency checks. Task authors who want shared inspection behavior can call private helper code from both their dry-run hook and check hook.

Session verification is independent from idempotency. When both session_verification=SessionVerificationConfig(...) and idempotency=IdempotencyMode.CHECK_AND_VERIFY are enabled, Genja replaces the connection before running the post-check, so the post-check uses the new session.

Logging

Rust-side runtime logs emitted by Genja are forwarded into Python's standard logging system when the extension module is imported. Configure Python logging handlers and levels before running Genja tasks:

import logging

import genja

logging.basicConfig(level=logging.INFO)

runtime = genja.Genja.from_hosts({
    "router1": {"hostname": "10.0.0.1", "platform": "ios"},
}).with_runner("serial")

Tests can capture those records with pytest's caplog fixture.

Full Inventory

Use genja.inventory when you need groups and defaults:

import genja
from genja.inventory import Defaults, Group, Host, Inventory

inventory = Inventory(
    hosts={
        "router1": Host(hostname="10.0.0.1", groups=["core"]),
    },
    groups={
        "core": Group(platform="ios", data={"role": "core"}),
    },
    defaults=Defaults(username="admin", port=22),
)

genja = genja.Genja.from_inventory(inventory)

print(genja.inventory_full())
print(genja.inventory_raw())

Inventory Accessors

The runtime exposes three inventory views:

  • genja.inventory(): raw hosts only
  • genja.inventory_full(): transformed hosts, groups, and defaults
  • genja.inventory_raw(): raw hosts, groups, and defaults

Plugins

You can register Python plugins directly:

import genja


class MyProcessorPlugin:
    name = "audit"
    group = "ProcessorPlugin"

    def on_task_finish(self, context, results):
        return None


plugins = genja.PluginManager()
plugins.register_plugin(MyProcessorPlugin())

Rust plugins can be loaded from a directory:

plugins = genja.PluginManager()
plugins.load_rust_plugins_from_directory("./plugins")

Settings Files

From A Settings File

Build a runtime from a settings file:

import genja

genja = genja.Genja.from_settings_file("config.yaml")

Settings files are strict: unknown fields fail loading instead of being ignored. Use explicit option maps such as runner.options for plugin-specific values.

From Programmatic Settings

Settings can also be built directly in Python. Use from_settings(...) when inventory should be loaded from settings.inventory:

import genja

settings = genja.Settings(
    inventory=genja.InventoryConfig(
        options=genja.OptionsConfig(
            hosts_file="./inventory/hosts.yaml",
        ),
    ),
    runner=genja.RunnerConfig(
        plugin="serial",
        retry=genja.RunnerRetryConfig(
            allow=True,
            max_attempts=3,
            delay_ms=250,
        ),
    ),
)

genja = genja.Genja.from_settings(settings)

Use from_settings_async(...) for programmatic settings or from_settings_file_async(...) for settings files when the selected inventory plugin is async. Async construction is strict: the selected inventory plugin must be async-capable, and sync-only inventory plugins such as the default FileInventoryPlugin are rejected.

import genja


class ApiInventoryPlugin(genja.InventoryPluginBase):
    name = "api_inventory"

    async def load(self, settings, plugins):
        return {
            "router1": {
                "hostname": "10.0.0.1",
                "platform": "ios",
            },
        }


plugins = genja.PluginManager()
plugins.register_plugin(ApiInventoryPlugin())

settings = genja.Settings(
    inventory=genja.InventoryConfig(plugin="api_inventory"),
)

genja = await genja.Genja.from_settings_async(settings, plugin_manager=plugins)

# Or load settings from a file with the same strict async inventory contract.
genja = await genja.Genja.from_settings_file_async(
    "config.yaml",
    plugin_manager=plugins,
)

Programmatic construction itself does not read files, but runtime creation validates supplied settings before building the runtime. To validate explicitly, call settings.validate() or settings.ssh.validate().

With Explicit Inventory

When host data is supplied directly, from_hosts(...) and from_inventory(...) continue to use that explicit inventory instead of loading from settings.inventory.

With Python Plugins

If you need Python plugins during settings-file loading, provide a plugin manager:

plugins = genja.PluginManager()
genja = genja.Genja.from_settings_file("config.yaml", plugin_manager=plugins)

The same plugin_manager argument is available on Genja.from_settings(...) and the async settings constructors for Python-authored inventory plugins.

Development

The commands below assume a repository checkout and use PDM-managed tooling.

Clone the repository and move into the Python package directory:

git clone git@github.com:Smertan/genja.git
cd genja/genja-core-python

Install the development dependencies:

pdm install -d

Build and install the Rust extension into the project virtual environment:

pdm run maturin develop

Run the Rust-side binding tests:

pdm run test-rust

Use pdm run test-rust instead of plain cargo test. The Rust tests embed Python and need access to the PDM-managed virtualenv packages such as pydantic.

Run the Python test suite:

pdm run test

Run Ruff:

pdm run lint

Check Python API stubs and PyO3 documentation coverage:

pdm run check-stubs

Run this when changing Rust/PyO3-exposed Python APIs, .pyi stubs, Python API docstrings, or top-level Python re-exports.

The check requires every top-level python/genja/*.pyi stub to be listed in STUBS_REQUIRING_DOCSTRINGS in scripts/check_python_api_docs.py. When adding a stub, document its public API and add it to that list during the same change. Add duplicated top-level re-export classes to DUPLICATED_TOP_LEVEL_CLASSES so genja.pyi and __init__.pyi stay aligned.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

genja_py-0.4.0.tar.gz (447.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

genja_py-0.4.0-cp314-cp314-win_amd64.whl (2.6 MB view details)

Uploaded CPython 3.14Windows x86-64

genja_py-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

genja_py-0.4.0-cp314-cp314-macosx_11_0_arm64.whl (2.8 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

genja_py-0.4.0-cp313-cp313-win_amd64.whl (2.6 MB view details)

Uploaded CPython 3.13Windows x86-64

genja_py-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

genja_py-0.4.0-cp313-cp313-macosx_11_0_arm64.whl (2.8 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

genja_py-0.4.0-cp312-cp312-win_amd64.whl (2.6 MB view details)

Uploaded CPython 3.12Windows x86-64

genja_py-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

genja_py-0.4.0-cp312-cp312-macosx_11_0_arm64.whl (2.8 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

genja_py-0.4.0-cp311-cp311-win_amd64.whl (2.6 MB view details)

Uploaded CPython 3.11Windows x86-64

genja_py-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

genja_py-0.4.0-cp311-cp311-macosx_11_0_arm64.whl (2.8 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

genja_py-0.4.0-cp310-cp310-win_amd64.whl (2.6 MB view details)

Uploaded CPython 3.10Windows x86-64

genja_py-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

genja_py-0.4.0-cp310-cp310-macosx_11_0_arm64.whl (2.8 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file genja_py-0.4.0.tar.gz.

File metadata

  • Download URL: genja_py-0.4.0.tar.gz
  • Upload date:
  • Size: 447.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for genja_py-0.4.0.tar.gz
Algorithm Hash digest
SHA256 534044e78060e953caef80eb96d161148de55fefb49fd1af779b43f0cf038054
MD5 568582d8491150e3fe00faff0dcf97bb
BLAKE2b-256 8ceffad493fecd140a4a2c36a66f2d087c4b496a4e91ed511ebf1ba7c81c77c4

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0.tar.gz:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file genja_py-0.4.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: genja_py-0.4.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 2.6 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for genja_py-0.4.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 6b68d74808629d6b9438c9423c6df8f1cd204130eb0836f56a2c69df1161d046
MD5 25e140525afb56c9baeefb2c32188bd6
BLAKE2b-256 24f58a00e36f9d9389e0a12d80719ded05c09bdb77c925cf18e75af15539a92f

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0-cp314-cp314-win_amd64.whl:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file genja_py-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for genja_py-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 86f8f5fe71dcdc3a8d451c58514fa522bf7fd306029f5784bed7b1063e521648
MD5 0c46786a016b1c9c48c11bfa14698002
BLAKE2b-256 1274bab632a265b1e7bad64376378fc246ec691b7be0ad2537a1e60c91040a33

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file genja_py-0.4.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for genja_py-0.4.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5d3ae5f5267f79a8656cca55639487f7667b7d0832db5cbc8f3fa0ba6f7e28c3
MD5 2075e23afe4fe4a98fccb71f232618c2
BLAKE2b-256 85147cc0010c2f24f8b5eca23b115a2ba352789ad737c2703e5e354f1a88b097

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file genja_py-0.4.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: genja_py-0.4.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 2.6 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for genja_py-0.4.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 09293ac6d1f63be1a08fe1e9712332050b214da53edee79b7e5c6e2603567fa0
MD5 58ea05bd306fcfa842eb37f509238deb
BLAKE2b-256 129f8c80f0a179768e2aefd781278923f6bb5169ca7092ed8507ff4725535e0c

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0-cp313-cp313-win_amd64.whl:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file genja_py-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for genja_py-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0641d468bb23033fc2c2ff291768535aab35e1cf055460321ae1bdd0939b322c
MD5 41607b1830722032d5a44209b4340ec4
BLAKE2b-256 41998a31959f5fa7548278ba33fa4f5f818de542aebb094e37476bd59013b590

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file genja_py-0.4.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for genja_py-0.4.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f14fa0912f238f0e20c6090ce040d0be3a891ea9f438e36d08dfe24fbde2097d
MD5 6083815cb5e3a5f19d759969638cbb90
BLAKE2b-256 5a754b690bc94d03289711e1b4929cb83ddc4c50b725ac6447079a937f09e461

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file genja_py-0.4.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: genja_py-0.4.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 2.6 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for genja_py-0.4.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3b17b0fc19d5bf55541e5c7ce8142395aaf14d7e2a0f903b874d409866f0b11d
MD5 965efb4abedd17ab82fc5936d05e231d
BLAKE2b-256 b30506bbeb7f14f66f4e3ffe449b8f57cd2489c422d5b4fe90958d47a9fc1d8e

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0-cp312-cp312-win_amd64.whl:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file genja_py-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for genja_py-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6083d42a92ec9f6dceef12fb9fdfddaf43061ef7f46179351ba3847a0607ce31
MD5 3d6aa6352fbabc7c68d1192afd0beab5
BLAKE2b-256 4183fca759af5307f413690757bdfa636a2ef0a5dbe59c30f420375e2b6f5e77

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file genja_py-0.4.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for genja_py-0.4.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b09d0e4b6189b0973f72f66e4471fb94ee1bb32796e4057abdc6cf89e5e7fbd8
MD5 f7e906f7c2a9b95c96d9476727f47738
BLAKE2b-256 d5a80126e71301ef62b9ea6570fb01b3120904ba2321111357cb8edc81409cd0

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file genja_py-0.4.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: genja_py-0.4.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 2.6 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for genja_py-0.4.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f8bcc1082ebb3081e389fbbb1ec9680518a265c367e54ae50639dfa2677da207
MD5 d1afdc9778f2a4e78326e0c35091269a
BLAKE2b-256 fdbeb07ff955c0a3a8f637c0bfbc0269703244c8bfb29297f91cf1cabd0f89fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0-cp311-cp311-win_amd64.whl:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file genja_py-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for genja_py-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 192b9b971d3025677795cb86c7a49aaadb7053d8162ccb61783b5405be4b7db8
MD5 aba8ad8b2b16aae130493581cbdf7570
BLAKE2b-256 d9302d5a3402b75a292d53aeaf4a95b14acb3297f2a2172501707f32f2ed6a06

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file genja_py-0.4.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for genja_py-0.4.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 18be35d3eeee4eedad0edb7fbf71ca124325a700574ce489b1711131f99d214f
MD5 c1affb49469ce002a01e6d0397f21220
BLAKE2b-256 5561217fad528364043d41df1d4235cbfc2e76f61e431250bd03d3449576cbde

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file genja_py-0.4.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: genja_py-0.4.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 2.6 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for genja_py-0.4.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b538b9251877e0ae781d6ebc654acec6a80d5562afc3ecd664b92365cfa9fede
MD5 77abf1494758296ca862a28d0d3dffde
BLAKE2b-256 3e9770f5d863bad10883c121339b5a259ce218662d8687a44ca0ee5b9e314307

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0-cp310-cp310-win_amd64.whl:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file genja_py-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for genja_py-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 97abb595ce523c22111a5fa0ff34840be806f29263f204f25bcfa4b0ccd056dd
MD5 bee801b339dcd2997153d820c47d2d6b
BLAKE2b-256 15c048ca2bf7cbfef9e1248e0002216572a8db66776d64c120329c20fa82cc69

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file genja_py-0.4.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for genja_py-0.4.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 14377bd6f2dad5b33bcc620f039e2874da9e66ccaccc287fb7cea8f0b5887991
MD5 61ae100a09480586031efa562de0e083
BLAKE2b-256 f8cd0c60abf24116ae76979bc9e6083613f26ac615104e025210f73ad8763179

See more details on using hashes here.

Provenance

The following attestation bundles were made for genja_py-0.4.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: publish-python.yml on Smertan/genja

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.4.0 This release

16 files

0.3.0

16 files

0.2.0

15 files

0.1.0

16 files

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