From 250ceeadc1f88ae673adb6c4941a24f3429ff28b Mon Sep 17 00:00:00 2001 From: Marcelo Henrique Neppel Date: Thu, 18 Jun 2026 15:20:02 -0300 Subject: [PATCH 1/6] build(deps): upgrade single-kernel library to 16.3.0 postgresql-charms-single-kernel 16.3.0 is now the released version, and it relocated `Substrates` from `config.literals` to `config.enums` and dropped `PEER` from the lib's public literals. The watcher must track that release to stay deployable: pinned to 16.2.2 its imports resolve, but built against the published 16.3.0 every hook crashes at import time. Bumping in lockstep keeps the charm installable on the same lib revision the rest of the PostgreSQL charms now consume. Signed-off-by: Marcelo Henrique Neppel --- poetry.lock | 189 +++++++++++++++++++++++++++-- pyproject.toml | 2 +- src/charm.py | 4 +- src/raft_controller.py | 2 +- src/relations/watcher_requirer.py | 2 +- tests/unit/test_raft_controller.py | 2 +- 6 files changed, 184 insertions(+), 17 deletions(-) diff --git a/poetry.lock b/poetry.lock index 40068fc..1374e3e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -54,7 +54,7 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" -groups = ["charm-libs"] +groups = ["main", "charm-libs"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -416,6 +416,59 @@ files = [ dunamai = ">=1.23.1" tomlkit = ">=0.13.2" +[[package]] +name = "charmlibs-interfaces-tls-certificates" +version = "1.8.3" +description = "The charmlibs.interfaces.tls_certificates package." +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "charmlibs_interfaces_tls_certificates-1.8.3-py3-none-any.whl", hash = "sha256:fa0aa150b4e4513d439c7afb7eb0ceaf00363671143b27b09382758deea8a0cc"}, + {file = "charmlibs_interfaces_tls_certificates-1.8.3.tar.gz", hash = "sha256:6bc35ee330681f2e0c58cf67e41133b144f3281f73d27293714c9ca918ee7cbc"}, +] + +[package.dependencies] +cryptography = ">=43.0.0" +ops = "*" +pydantic = "*" + +[[package]] +name = "charmlibs-pathops" +version = "1.3.0.post0" +description = "A pathlib-like interface for Juju K8s charms to interact with files in their workload container." +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "charmlibs_pathops-1.3.0.post0-py3-none-any.whl", hash = "sha256:c6fc3e3460ffa03a7d4273cc7784c9d74378609a098c728cd9bbb2ed90bdfa5b"}, + {file = "charmlibs_pathops-1.3.0.post0.tar.gz", hash = "sha256:36ac11b0c7c55b71341a549a1803f5c8d61c2279204862b8d50736041b782f59"}, +] + +[package.dependencies] +ops = ">=2.19,<4" + +[[package]] +name = "charmlibs-rollingops" +version = "1.1.1" +description = "The charmlibs.rollingops package." +optional = false +python-versions = ">=3.12" +groups = ["main"] +files = [ + {file = "charmlibs_rollingops-1.1.1-py3-none-any.whl", hash = "sha256:1e61347c7792ec11afefa60d36f77a5afccf867832854d5aeef2da0b536afec4"}, + {file = "charmlibs_rollingops-1.1.1.tar.gz", hash = "sha256:831457d2ef12117794f89a483ee9a5c347cb209a87dafe82907e9dede7d4641c"}, +] + +[package.dependencies] +charmlibs-interfaces-tls-certificates = ">=1.8.1" +charmlibs-pathops = ">=1.2.1" +dpcharmlibs-interfaces = "1.0.0" +ops = ">=2.23.1,<4" +pydantic = ">=2.12.5" +shortuuid = ">=1.0.13" +tenacity = "*" + [[package]] name = "charmlibs-snap" version = "1.0.1.post0" @@ -794,6 +847,27 @@ cffi = {version = ">=2.0.0", markers = "platform_python_implementation != \"PyPy [package.extras] ssh = ["bcrypt (>=3.1.5)"] +[[package]] +name = "data-platform-helpers" +version = "1.1.0" +description = "" +optional = false +python-versions = "<4.0,>=3.10" +groups = ["main"] +files = [ + {file = "data_platform_helpers-1.1.0-py3-none-any.whl", hash = "sha256:71b2c2ba31d1bc01c55c9da82d02b0cb654b99231172916722ecaf4c469d27c4"}, + {file = "data_platform_helpers-1.1.0.tar.gz", hash = "sha256:7539ef1c1047fec36ee8298aa4c75fe2bb36419544193b691805c12ca407a797"}, +] + +[package.dependencies] +ops = ">=3,<4" +pydantic = ">=2.11,<3" +rich = "*" + +[package.extras] +all = ["pytest-operator"] +tests = ["pytest-operator"] + [[package]] name = "decorator" version = "5.3.1" @@ -806,6 +880,22 @@ files = [ {file = "decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82"}, ] +[[package]] +name = "dpcharmlibs-interfaces" +version = "1.0.0" +description = "The dpcharmlibs.interfaces package." +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "dpcharmlibs_interfaces-1.0.0-py3-none-any.whl", hash = "sha256:afff80be30e3ff8c31f68557946e9d5959247f1973cbc00e96da55b095f95a21"}, + {file = "dpcharmlibs_interfaces-1.0.0.tar.gz", hash = "sha256:a177653019781a7a165be52cf4293134ee58912cd93686082cdd82da347a3bed"}, +] + +[package.dependencies] +ops = ">=3,<4" +pydantic = ">=2.11,<3" + [[package]] name = "dunamai" version = "1.26.1" @@ -1302,6 +1392,30 @@ pyRFC3339 = ">=1.0,<2.0" requests = ">=2.18.1,<3.0" six = ">=1.11.0,<2.0" +[[package]] +name = "markdown-it-py" +version = "4.2.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a"}, + {file = "markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "markdown-it-pyrs", "mistletoe (>=1.0,<2.0)", "mistune (>=3.0,<4.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins (>=0.5.0)"] +profiling = ["gprof2dot"] +rtd = ["ipykernel", "jupyter_sphinx", "mdit-py-plugins (>=0.5.0)", "myst-parser", "pyyaml", "sphinx", "sphinx-book-theme (>=1.0,<2.0)", "sphinx-copybutton", "sphinx-design"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions", "pytest-timeout", "requests"] + [[package]] name = "markupsafe" version = "3.0.3" @@ -1419,6 +1533,18 @@ traitlets = "*" [package.extras] test = ["flake8", "matplotlib", "nbdime", "nbval", "notebook", "pytest"] +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + [[package]] name = "mypy-extensions" version = "1.1.0" @@ -1591,24 +1717,34 @@ testing = ["coverage", "pytest", "pytest-benchmark"] [[package]] name = "postgresql-charms-single-kernel" -version = "16.2.2" +version = "16.3.0" description = "Shared and reusable code for PostgreSQL-related charms" optional = false python-versions = "<4.0,>=3.8" groups = ["main"] files = [ - {file = "postgresql_charms_single_kernel-16.2.2-py3-none-any.whl", hash = "sha256:53b485f34aa1159e9875fd8e4d73870bc92e855eeec5175aa76a33829f4446b2"}, - {file = "postgresql_charms_single_kernel-16.2.2.tar.gz", hash = "sha256:95d027d1d52a4eb0237b2fd7cc6b548b279d7a99f82835659d9553f208dc2f81"}, + {file = "postgresql_charms_single_kernel-16.3.0-py3-none-any.whl", hash = "sha256:3f0a392b3f26ce3676ac365b49f25baa6ac812f82143c517689935f42114efbd"}, + {file = "postgresql_charms_single_kernel-16.3.0.tar.gz", hash = "sha256:7e0d7db80d0b1a5a97baf002809c101d55e4ffe5b9f26a3ae20b9b150c6ae51e"}, ] [package.dependencies] +charm-refresh = {version = "*", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} +charmlibs-interfaces-tls-certificates = {version = ">=1.8.3", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} +charmlibs-pathops = {version = ">=1.0.1", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} +charmlibs-rollingops = {version = ">=1.1.1", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} +charmlibs-snap = {version = ">=1.0.1", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} +data-platform-helpers = {version = ">=0.1.7", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} httpx = {version = "*", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} +jinja2 = {version = ">=3.1.6", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} ops = ">=2.0.0" -psycopg2 = ">=2.9.10" +psycopg2 = {version = ">=2.9.10", optional = true, markers = "extra == \"postgresql\""} +pydantic = {version = ">=2.0", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} +requests = {version = "*", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} tenacity = ">=9.0.0" +tomli = {version = "*", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} [package.extras] -postgresql = ["httpx ; python_full_version >= \"3.12.0\""] +postgresql = ["charm-refresh ; python_full_version >= \"3.12.0\"", "charmlibs-interfaces-tls-certificates (>=1.8.3) ; python_full_version >= \"3.12.0\"", "charmlibs-pathops (>=1.0.1) ; python_full_version >= \"3.12.0\"", "charmlibs-rollingops (>=1.1.1) ; python_full_version >= \"3.12.0\"", "charmlibs-snap (>=1.0.1) ; python_full_version >= \"3.12.0\"", "data-platform-helpers (>=0.1.7) ; python_full_version >= \"3.12.0\"", "httpx ; python_full_version >= \"3.12.0\"", "jinja2 (>=3.1.6) ; python_full_version >= \"3.12.0\"", "psycopg2 (>=2.9.10)", "pydantic (>=2.0) ; python_full_version >= \"3.12.0\"", "requests ; python_full_version >= \"3.12.0\"", "tomli ; python_full_version >= \"3.12.0\""] [[package]] name = "prompt-toolkit" @@ -1847,7 +1983,7 @@ version = "2.13.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.9" -groups = ["charm-libs"] +groups = ["main", "charm-libs"] files = [ {file = "pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba"}, {file = "pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6"}, @@ -1869,7 +2005,7 @@ version = "2.46.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.9" -groups = ["charm-libs"] +groups = ["main", "charm-libs"] files = [ {file = "pydantic_core-2.46.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a396dcc17e5a0b164dbe026896245a4fa9ff402edca1dff0be3d53a517f74de4"}, {file = "pydantic_core-2.46.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da4b951fe36dc7c3a1ccb4e3cd1747c3542b8c9ceede8fc86cae054e764485f5"}, @@ -2002,7 +2138,7 @@ version = "2.20.0" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.9" -groups = ["integration", "unit"] +groups = ["main", "integration", "unit"] files = [ {file = "pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"}, {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"}, @@ -2324,6 +2460,25 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] +[[package]] +name = "rich" +version = "15.0.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.9.0" +groups = ["main"] +files = [ + {file = "rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb"}, + {file = "rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + [[package]] name = "rpds-py" version = "2026.5.1" @@ -2492,6 +2647,18 @@ files = [ {file = "ruff-0.15.17.tar.gz", hash = "sha256:2ec446937fd16c8c4de2674a209cc5af64d9c6f17d21fbf1151054fa0bcf5219"}, ] +[[package]] +name = "shortuuid" +version = "1.0.13" +description = "A generator library for concise, unambiguous and URL-safe UUIDs." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "shortuuid-1.0.13-py3-none-any.whl", hash = "sha256:a482a497300b49b4953e15108a7913244e1bb0d41f9d332f5e9925dba33a3c5a"}, + {file = "shortuuid-1.0.13.tar.gz", hash = "sha256:3bb9cf07f606260584b1df46399c0b87dd84773e7b25912b7e391e30797c5e72"}, +] + [[package]] name = "six" version = "1.17.0" @@ -2712,7 +2879,7 @@ version = "0.4.2" description = "Runtime typing introspection tools" optional = false python-versions = ">=3.9" -groups = ["charm-libs"] +groups = ["main", "charm-libs"] files = [ {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, @@ -2857,4 +3024,4 @@ h11 = ">=0.16.0,<1" [metadata] lock-version = "2.1" python-versions = ">=3.12,<4.0" -content-hash = "199aea2b65a3996cb90f1f94d5d010ca131372c5b2d3b2a563c633e4aac454dd" +content-hash = "85ebb317188c6e4c3820444b34d5bfd7faf819c201bbef6546c14f3e63c391d4" diff --git a/pyproject.toml b/pyproject.toml index dfcf476..eadad62 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ pysyncobj = "^0.3.15" charm-refresh = "^3.1.0.2" charmlibs-snap = "^1.0.1" charmlibs-systemd = "^1.0.0" -postgresql-charms-single-kernel = {extras = ["postgresql"], version="16.2.2"} +postgresql-charms-single-kernel = {extras = ["postgresql"], version="16.3.0"} [tool.poetry.group.charm-libs.dependencies] # data_platform_libs/v0/data_models.py diff --git a/src/charm.py b/src/charm.py index 8312d1f..2b176b2 100755 --- a/src/charm.py +++ b/src/charm.py @@ -25,11 +25,11 @@ SecretRemoveEvent, main, ) -from single_kernel_postgresql.config.literals import PEER, Substrates +from single_kernel_postgresql.config.enums import Substrates from single_kernel_postgresql.utils import _change_owner from config import CharmConfig -from constants import SNAP_COMMON_PATH +from constants import PEER, SNAP_COMMON_PATH from raft_controller import install_service from relations.watcher_requirer import WatcherRequirerHandler diff --git a/src/raft_controller.py b/src/raft_controller.py index 1576af3..a41384f 100644 --- a/src/raft_controller.py +++ b/src/raft_controller.py @@ -34,7 +34,7 @@ ) from jinja2 import Template from pysyncobj.utility import TcpUtility -from single_kernel_postgresql.config.literals import Substrates +from single_kernel_postgresql.config.enums import Substrates from single_kernel_postgresql.utils import ( create_directory, parallel_patroni_get_request, diff --git a/src/relations/watcher_requirer.py b/src/relations/watcher_requirer.py index 71307b9..41a8c0b 100644 --- a/src/relations/watcher_requirer.py +++ b/src/relations/watcher_requirer.py @@ -38,7 +38,7 @@ UpdateStatusEvent, WaitingStatus, ) -from single_kernel_postgresql.config.literals import Substrates +from single_kernel_postgresql.config.enums import Substrates from single_kernel_postgresql.utils import _change_owner from constants import RAFT_PORT, SNAP_COMMON_PATH, WATCHER_RELATION diff --git a/tests/unit/test_raft_controller.py b/tests/unit/test_raft_controller.py index 718028f..77dba6f 100644 --- a/tests/unit/test_raft_controller.py +++ b/tests/unit/test_raft_controller.py @@ -6,7 +6,7 @@ from jinja2 import Template from pytest import fixture -from single_kernel_postgresql.config.literals import Substrates +from single_kernel_postgresql.config.enums import Substrates from tenacity import stop_after_delay, wait_fixed from constants import RAFT_PARTNER_PREFIX From 444fd2442efbb25b46892780fcba9f851e1d16d7 Mon Sep 17 00:00:00 2001 From: Marcelo Henrique Neppel Date: Fri, 19 Jun 2026 17:58:32 -0300 Subject: [PATCH 2/6] refactor(constants): source shared constants from the single-kernel lib PATRONI_CLUSTER_STATUS_ENDPOINT and WATCHER_RELATION are identical to the lib's literals and used only in runtime modules (not the lib-less integration-test path), so import them from single_kernel_postgresql.config.literals instead of redefining them locally. Drop the dead API_REQUEST_TIMEOUT/SNAP_NAME/SNAP_CHANNEL. PEER, RAFT_PARTNER_PREFIX, RAFT_PORT, and SNAP_COMMON_PATH stay local: the integration tests import constants.py without the lib installed, so it must remain lib-import-free. Signed-off-by: Marcelo Henrique Neppel --- src/constants.py | 5 ----- src/raft_controller.py | 3 ++- src/relations/watcher_requirer.py | 6 ++---- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/constants.py b/src/constants.py index 6ab1efd..f825b4a 100644 --- a/src/constants.py +++ b/src/constants.py @@ -3,15 +3,10 @@ """File containing constants to be used in the charm.""" -API_REQUEST_TIMEOUT = 5 -PATRONI_CLUSTER_STATUS_ENDPOINT = "cluster" PEER = "database-peers" # Snap constants. SNAP_COMMON_PATH = "/var/snap/charmed-postgresql/common" -# # Watcher constants -WATCHER_RELATION = "watcher" - RAFT_PORT = 2222 RAFT_PARTNER_PREFIX = "partner_node_status_server_" diff --git a/src/raft_controller.py b/src/raft_controller.py index a41384f..5d8721a 100644 --- a/src/raft_controller.py +++ b/src/raft_controller.py @@ -35,6 +35,7 @@ from jinja2 import Template from pysyncobj.utility import TcpUtility from single_kernel_postgresql.config.enums import Substrates +from single_kernel_postgresql.config.literals import PATRONI_CLUSTER_STATUS_ENDPOINT from single_kernel_postgresql.utils import ( create_directory, parallel_patroni_get_request, @@ -43,7 +44,7 @@ from tenacity import RetryError, Retrying, stop_after_attempt, wait_fixed from cluster import ClusterMember -from constants import PATRONI_CLUSTER_STATUS_ENDPOINT, RAFT_PARTNER_PREFIX, RAFT_PORT +from constants import RAFT_PARTNER_PREFIX, RAFT_PORT if TYPE_CHECKING: from charm import PostgresqlWatcherCharm diff --git a/src/relations/watcher_requirer.py b/src/relations/watcher_requirer.py index 41a8c0b..7ace749 100644 --- a/src/relations/watcher_requirer.py +++ b/src/relations/watcher_requirer.py @@ -39,9 +39,10 @@ WaitingStatus, ) from single_kernel_postgresql.config.enums import Substrates +from single_kernel_postgresql.config.literals import WATCHER_RELATION from single_kernel_postgresql.utils import _change_owner -from constants import RAFT_PORT, SNAP_COMMON_PATH, WATCHER_RELATION +from constants import RAFT_PORT, SNAP_COMMON_PATH from raft_controller import RaftController, install_service if typing.TYPE_CHECKING: @@ -49,9 +50,6 @@ logger = logging.getLogger(__name__) -SNAP_NAME = "charmed-postgresql" -SNAP_CHANNEL = "16/edge" - class WatcherRequirerHandler(Object): """Handles the watcher requirer relation and watcher-mode lifecycle.""" From 813e4abdfacd953d7caf91d38f3197dba98f9ced Mon Sep 17 00:00:00 2001 From: Marcelo Henrique Neppel Date: Fri, 19 Jun 2026 18:32:51 -0300 Subject: [PATCH 3/6] refactor(constants): use the lib's PEER_RELATION instead of a local PEER The lib exposes the peer-relation name as PEER_RELATION ("database-peers"); the watcher redefined the same string locally as PEER. Drop the local PEER and import PEER_RELATION from single_kernel_postgresql.config.literals in charm.py and the integration tests, so the peer-relation name has one canonical source. To make the lib importable in the lib-less integration env, move the single-kernel dependency into a dedicated poetry group (mirroring the postgresql charm PRs) and add it to the unit/integration tox envs and the charmcraft export. The value is unchanged, so secret labels and the peer-relation lookup are unaffected. Signed-off-by: Marcelo Henrique Neppel --- charmcraft.yaml | 2 +- poetry.lock | 100 +++++++++--------- pyproject.toml | 4 +- src/charm.py | 5 +- src/constants.py | 2 - tests/integration/helpers.py | 5 +- .../high_availability_helpers_new.py | 5 +- tox.ini | 4 +- 8 files changed, 64 insertions(+), 63 deletions(-) diff --git a/charmcraft.yaml b/charmcraft.yaml index 1441200..08bf32b 100644 --- a/charmcraft.yaml +++ b/charmcraft.yaml @@ -51,7 +51,7 @@ parts: source: . after: - poetry-deps - poetry-export-extra-args: ['--only', 'main,charm-libs'] + poetry-export-extra-args: ['--only', 'main,charm-libs,single-kernel'] build-packages: - libffi-dev # Needed to build Python dependencies with Rust from source - libssl-dev # Needed to build Python dependencies with Rust from source diff --git a/poetry.lock b/poetry.lock index 1374e3e..b1b7e0c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -54,7 +54,7 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" -groups = ["main", "charm-libs"] +groups = ["charm-libs", "single-kernel"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -66,7 +66,7 @@ version = "4.14.0" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "anyio-4.14.0-py3-none-any.whl", hash = "sha256:dd9b7a2a9799ed6552fde617b2c5df02b7fdd7d88392fc48101e51bae46164d9"}, {file = "anyio-4.14.0.tar.gz", hash = "sha256:b47c1f9ccf73e67021df785332508f99379c68fa7d0684e8e3492cb1d4b23f89"}, @@ -247,7 +247,7 @@ version = "2026.5.20" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" -groups = ["main", "integration"] +groups = ["main", "integration", "single-kernel"] files = [ {file = "certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897"}, {file = "certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d"}, @@ -259,7 +259,7 @@ version = "2.0.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.9" -groups = ["main", "integration"] +groups = ["main", "integration", "single-kernel"] markers = "platform_python_implementation != \"PyPy\"" files = [ {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, @@ -357,7 +357,7 @@ version = "0.1.3" description = "" optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "charm_api-0.1.3-py3-none-any.whl", hash = "sha256:4dba74e33f3de4608e88db2e08e41b0681221e7d3c2cd6913e0ebeb3dbdf8d92"}, {file = "charm_api-0.1.3.tar.gz", hash = "sha256:a90a926b89fce834e9fb2184b96e07ec46f4dd56f3cd50e0209c0fd0ff35a29e"}, @@ -369,7 +369,7 @@ version = "0.1.2" description = "" optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "charm_json-0.1.2-py3-none-any.whl", hash = "sha256:1cad028a92831c61d6dcb99127c5216c333f90ec58d06b9f73fd0fd7355d1b3c"}, {file = "charm_json-0.1.2.tar.gz", hash = "sha256:f91255858cd6721ec491d09450f37a0cdecf1addbfcfbd41f3e27c58dd95092e"}, @@ -384,7 +384,7 @@ version = "3.1.1.4" description = "In-place rolling refreshes (upgrades) of stateful charmed applications" optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "charm_refresh-3.1.1.4-py3-none-any.whl", hash = "sha256:6ff6e04170c03b3fe3f23bbf32a288a0de3da0d44bf2e8dd850ee02925bf2ec6"}, {file = "charm_refresh-3.1.1.4.tar.gz", hash = "sha256:d33f66e5b65fd356a30bfbc634710e5538086199da93c30c86246370a66570be"}, @@ -422,7 +422,7 @@ version = "1.8.3" description = "The charmlibs.interfaces.tls_certificates package." optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["single-kernel"] files = [ {file = "charmlibs_interfaces_tls_certificates-1.8.3-py3-none-any.whl", hash = "sha256:fa0aa150b4e4513d439c7afb7eb0ceaf00363671143b27b09382758deea8a0cc"}, {file = "charmlibs_interfaces_tls_certificates-1.8.3.tar.gz", hash = "sha256:6bc35ee330681f2e0c58cf67e41133b144f3281f73d27293714c9ca918ee7cbc"}, @@ -439,7 +439,7 @@ version = "1.3.0.post0" description = "A pathlib-like interface for Juju K8s charms to interact with files in their workload container." optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["single-kernel"] files = [ {file = "charmlibs_pathops-1.3.0.post0-py3-none-any.whl", hash = "sha256:c6fc3e3460ffa03a7d4273cc7784c9d74378609a098c728cd9bbb2ed90bdfa5b"}, {file = "charmlibs_pathops-1.3.0.post0.tar.gz", hash = "sha256:36ac11b0c7c55b71341a549a1803f5c8d61c2279204862b8d50736041b782f59"}, @@ -454,7 +454,7 @@ version = "1.1.1" description = "The charmlibs.rollingops package." optional = false python-versions = ">=3.12" -groups = ["main"] +groups = ["single-kernel"] files = [ {file = "charmlibs_rollingops-1.1.1-py3-none-any.whl", hash = "sha256:1e61347c7792ec11afefa60d36f77a5afccf867832854d5aeef2da0b536afec4"}, {file = "charmlibs_rollingops-1.1.1.tar.gz", hash = "sha256:831457d2ef12117794f89a483ee9a5c347cb209a87dafe82907e9dede7d4641c"}, @@ -475,7 +475,7 @@ version = "1.0.1.post0" description = "The charmlibs.snap package." optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "charmlibs_snap-1.0.1.post0-py3-none-any.whl", hash = "sha256:655041096952c63e92c8d25a6183149f0594d4888be4be62a9635cb96897aa01"}, {file = "charmlibs_snap-1.0.1.post0.tar.gz", hash = "sha256:1e8da752ee405aa981665da8c4772016236baf80d2d902b02ec8c1c640fb2844"}, @@ -502,7 +502,7 @@ version = "3.4.7" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["main", "integration"] +groups = ["main", "integration", "single-kernel"] files = [ {file = "charset_normalizer-3.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d"}, {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8"}, @@ -791,7 +791,7 @@ version = "49.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.9" -groups = ["main", "integration"] +groups = ["main", "integration", "single-kernel"] files = [ {file = "cryptography-49.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db"}, {file = "cryptography-49.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db"}, @@ -853,7 +853,7 @@ version = "1.1.0" description = "" optional = false python-versions = "<4.0,>=3.10" -groups = ["main"] +groups = ["single-kernel"] files = [ {file = "data_platform_helpers-1.1.0-py3-none-any.whl", hash = "sha256:71b2c2ba31d1bc01c55c9da82d02b0cb654b99231172916722ecaf4c469d27c4"}, {file = "data_platform_helpers-1.1.0.tar.gz", hash = "sha256:7539ef1c1047fec36ee8298aa4c75fe2bb36419544193b691805c12ca407a797"}, @@ -886,7 +886,7 @@ version = "1.0.0" description = "The dpcharmlibs.interfaces package." optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["single-kernel"] files = [ {file = "dpcharmlibs_interfaces-1.0.0-py3-none-any.whl", hash = "sha256:afff80be30e3ff8c31f68557946e9d5959247f1973cbc00e96da55b095f95a21"}, {file = "dpcharmlibs_interfaces-1.0.0.tar.gz", hash = "sha256:a177653019781a7a165be52cf4293134ee58912cd93686082cdd82da347a3bed"}, @@ -960,7 +960,7 @@ version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, @@ -972,7 +972,7 @@ version = "4.3.0" description = "Pure-Python HTTP/2 protocol implementation" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd"}, {file = "h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1"}, @@ -988,7 +988,7 @@ version = "4.1.0" description = "Pure-Python HPACK header encoding" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496"}, {file = "hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca"}, @@ -1000,7 +1000,7 @@ version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, @@ -1022,7 +1022,7 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1048,7 +1048,7 @@ version = "0.9.0" description = "WebSockets support for HTTPX" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "httpx_ws-0.9.0-py3-none-any.whl", hash = "sha256:71640d2fb1bf9a225775015b33cd755cfd4c5f7e21c885192fe3adc4c387b248"}, {file = "httpx_ws-0.9.0.tar.gz", hash = "sha256:797373326f70eec1ae96f6e43ae9f12002fd7d73aee139a4985eaab964338a08"}, @@ -1084,7 +1084,7 @@ version = "6.1.0" description = "Pure-Python HTTP/2 framing" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5"}, {file = "hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08"}, @@ -1096,7 +1096,7 @@ version = "3.18" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.9" -groups = ["main", "integration"] +groups = ["main", "integration", "single-kernel"] files = [ {file = "idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2"}, {file = "idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848"}, @@ -1218,7 +1218,7 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["main", "integration"] +groups = ["main", "integration", "single-kernel"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1345,7 +1345,7 @@ version = "0.21.0" description = "Lightweight kubernetes client library" optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "lightkube-0.21.0-py3-none-any.whl", hash = "sha256:5218c9a7029b5ba8a3e90534141795c6bb3ec3e96894afccb55f0581ca8d59b2"}, {file = "lightkube-0.21.0.tar.gz", hash = "sha256:720910200de4bd88e0d7b5d2edfb45a4f6be292798b8776d7b551ef5a5ccdc15"}, @@ -1366,7 +1366,7 @@ version = "1.35.0.8" description = "Models and Resources for lightkube module" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "lightkube_models-1.35.0.8-py3-none-any.whl", hash = "sha256:d01fce42f96baf47a77a571bff59d6a513e96ae043fc03cfaaaaf79c609c4441"}, {file = "lightkube_models-1.35.0.8.tar.gz", hash = "sha256:dbc624596a7d94e6c43c5deda972be964202e0e8f26e2ab8e61d589d710b5e22"}, @@ -1398,7 +1398,7 @@ version = "4.2.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["single-kernel"] files = [ {file = "markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a"}, {file = "markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49"}, @@ -1422,7 +1422,7 @@ version = "3.0.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" -groups = ["main", "integration"] +groups = ["main", "integration", "single-kernel"] files = [ {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, @@ -1539,7 +1539,7 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" -groups = ["main"] +groups = ["single-kernel"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -1580,7 +1580,7 @@ version = "1.42.1" description = "OpenTelemetry Python API" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "opentelemetry_api-1.42.1-py3-none-any.whl", hash = "sha256:51a69edacadbc03a8950ace1c4c21099cacc538820ac2c9e36277e78cebba714"}, {file = "opentelemetry_api-1.42.1.tar.gz", hash = "sha256:56c63bea9f77b62856be8c47600474acad853b2924b99b1687c4cb6297166716"}, @@ -1595,7 +1595,7 @@ version = "3.7.1" description = "The Python library behind great charms" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "ops-3.7.1-py3-none-any.whl", hash = "sha256:559dc6770e551da5f4b9686a5605ed927c140182eb38bcc31c1c531c2f98923a"}, {file = "ops-3.7.1.tar.gz", hash = "sha256:1765bf6d1cff376ea27608542e183b055c89f2c5f54bca602072bcc817195abc"}, @@ -1616,7 +1616,7 @@ version = "26.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "build-refresh-version", "integration", "unit"] +groups = ["main", "build-refresh-version", "integration", "single-kernel", "unit"] files = [ {file = "packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e"}, {file = "packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661"}, @@ -1721,7 +1721,7 @@ version = "16.3.0" description = "Shared and reusable code for PostgreSQL-related charms" optional = false python-versions = "<4.0,>=3.8" -groups = ["main"] +groups = ["single-kernel"] files = [ {file = "postgresql_charms_single_kernel-16.3.0-py3-none-any.whl", hash = "sha256:3f0a392b3f26ce3676ac365b49f25baa6ac812f82143c517689935f42114efbd"}, {file = "postgresql_charms_single_kernel-16.3.0.tar.gz", hash = "sha256:7e0d7db80d0b1a5a97baf002809c101d55e4ffe5b9f26a3ae20b9b150c6ae51e"}, @@ -1821,7 +1821,7 @@ version = "2.9.12" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "psycopg2-2.9.12-cp310-cp310-win_amd64.whl", hash = "sha256:d5fbe092315fb007c03544704e6d1e678a6c0378139d01cea433dc59edf041b4"}, {file = "psycopg2-2.9.12-cp311-cp311-win_amd64.whl", hash = "sha256:2532c0cdc6ad18c9c35cd935cc3159712e14f05276a6d29a6435c52d24b840c1"}, @@ -1970,7 +1970,7 @@ version = "3.0" description = "C parser in Python" optional = false python-versions = ">=3.10" -groups = ["main", "integration"] +groups = ["main", "integration", "single-kernel"] markers = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"" files = [ {file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"}, @@ -1983,7 +1983,7 @@ version = "2.13.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.9" -groups = ["main", "charm-libs"] +groups = ["charm-libs", "single-kernel"] files = [ {file = "pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba"}, {file = "pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6"}, @@ -2005,7 +2005,7 @@ version = "2.46.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.9" -groups = ["main", "charm-libs"] +groups = ["charm-libs", "single-kernel"] files = [ {file = "pydantic_core-2.46.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a396dcc17e5a0b164dbe026896245a4fa9ff402edca1dff0be3d53a517f74de4"}, {file = "pydantic_core-2.46.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da4b951fe36dc7c3a1ccb4e3cd1747c3542b8c9ceede8fc86cae054e764485f5"}, @@ -2138,7 +2138,7 @@ version = "2.20.0" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.9" -groups = ["main", "integration", "unit"] +groups = ["integration", "single-kernel", "unit"] files = [ {file = "pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"}, {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"}, @@ -2325,7 +2325,7 @@ version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["main", "integration"] +groups = ["main", "integration", "single-kernel"] files = [ {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, @@ -2425,7 +2425,7 @@ version = "2.34.2" description = "Python HTTP for Humans." optional = false python-versions = ">=3.10" -groups = ["main", "integration"] +groups = ["main", "integration", "single-kernel"] files = [ {file = "requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0"}, {file = "requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed"}, @@ -2466,7 +2466,7 @@ version = "15.0.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.9.0" -groups = ["main"] +groups = ["single-kernel"] files = [ {file = "rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb"}, {file = "rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36"}, @@ -2653,7 +2653,7 @@ version = "1.0.13" description = "A generator library for concise, unambiguous and URL-safe UUIDs." optional = false python-versions = ">=3.6" -groups = ["main"] +groups = ["single-kernel"] files = [ {file = "shortuuid-1.0.13-py3-none-any.whl", hash = "sha256:a482a497300b49b4953e15108a7913244e1bb0d41f9d332f5e9925dba33a3c5a"}, {file = "shortuuid-1.0.13.tar.gz", hash = "sha256:3bb9cf07f606260584b1df46399c0b87dd84773e7b25912b7e391e30797c5e72"}, @@ -2697,7 +2697,7 @@ version = "9.1.4" description = "Retry code until it succeeds" optional = false python-versions = ">=3.10" -groups = ["main", "integration"] +groups = ["main", "integration", "single-kernel"] files = [ {file = "tenacity-9.1.4-py3-none-any.whl", hash = "sha256:6095a360c919085f28c6527de529e76a06ad89b23659fa881ae0649b867a9d55"}, {file = "tenacity-9.1.4.tar.gz", hash = "sha256:adb31d4c263f2bd041081ab33b498309a57c77f9acf2db65aadf0898179cf93a"}, @@ -2713,7 +2713,7 @@ version = "2.4.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["main", "integration"] +groups = ["main", "integration", "single-kernel"] files = [ {file = "tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30"}, {file = "tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a"}, @@ -2850,7 +2850,7 @@ version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" -groups = ["main", "charm-libs", "integration", "unit"] +groups = ["main", "charm-libs", "integration", "single-kernel", "unit"] files = [ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, @@ -2879,7 +2879,7 @@ version = "0.4.2" description = "Runtime typing introspection tools" optional = false python-versions = ">=3.9" -groups = ["main", "charm-libs"] +groups = ["charm-libs", "single-kernel"] files = [ {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, @@ -2894,7 +2894,7 @@ version = "2.7.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.10" -groups = ["main", "integration"] +groups = ["main", "integration", "single-kernel"] files = [ {file = "urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897"}, {file = "urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c"}, @@ -2924,7 +2924,7 @@ version = "1.9.0" description = "WebSocket client for Python with low level API options" optional = false python-versions = ">=3.9" -groups = ["main", "integration"] +groups = ["main", "integration", "single-kernel"] files = [ {file = "websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef"}, {file = "websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98"}, @@ -3012,7 +3012,7 @@ version = "1.3.2" description = "Pure-Python WebSocket protocol implementation" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["main", "single-kernel"] files = [ {file = "wsproto-1.3.2-py3-none-any.whl", hash = "sha256:61eea322cdf56e8cc904bd3ad7573359a242ba65688716b0710a5eb12beab584"}, {file = "wsproto-1.3.2.tar.gz", hash = "sha256:b86885dcf294e15204919950f666e06ffc6c7c114ca900b060d6e16293528294"}, @@ -3024,4 +3024,4 @@ h11 = ">=0.16.0,<1" [metadata] lock-version = "2.1" python-versions = ">=3.12,<4.0" -content-hash = "85ebb317188c6e4c3820444b34d5bfd7faf819c201bbef6546c14f3e63c391d4" +content-hash = "9c18b89d5dc55c1831a045ca76926ad4821e5639e31e1e6d2edc1c2e1e116958" diff --git a/pyproject.toml b/pyproject.toml index eadad62..877145a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,9 @@ pysyncobj = "^0.3.15" charm-refresh = "^3.1.0.2" charmlibs-snap = "^1.0.1" charmlibs-systemd = "^1.0.0" -postgresql-charms-single-kernel = {extras = ["postgresql"], version="16.3.0"} + +[tool.poetry.group.single-kernel.dependencies] +postgresql-charms-single-kernel = {extras = ["postgresql"], version = "16.3.0"} [tool.poetry.group.charm-libs.dependencies] # data_platform_libs/v0/data_models.py diff --git a/src/charm.py b/src/charm.py index 2b176b2..be2fc34 100755 --- a/src/charm.py +++ b/src/charm.py @@ -26,10 +26,11 @@ main, ) from single_kernel_postgresql.config.enums import Substrates +from single_kernel_postgresql.config.literals import PEER_RELATION from single_kernel_postgresql.utils import _change_owner from config import CharmConfig -from constants import PEER, SNAP_COMMON_PATH +from constants import SNAP_COMMON_PATH from raft_controller import install_service from relations.watcher_requirer import WatcherRequirerHandler @@ -285,7 +286,7 @@ def _peers(self) -> Relation | None: A:class:`ops.model.Relation` object representing the peer relation. """ - return self.model.get_relation(PEER) + return self.model.get_relation(PEER_RELATION) if __name__ == "__main__": diff --git a/src/constants.py b/src/constants.py index f825b4a..549cab8 100644 --- a/src/constants.py +++ b/src/constants.py @@ -3,8 +3,6 @@ """File containing constants to be used in the charm.""" -PEER = "database-peers" - # Snap constants. SNAP_COMMON_PATH = "/var/snap/charmed-postgresql/common" diff --git a/tests/integration/helpers.py b/tests/integration/helpers.py index 7a4c0db..d5c7dcb 100644 --- a/tests/integration/helpers.py +++ b/tests/integration/helpers.py @@ -12,14 +12,13 @@ import yaml from juju.model import Model from pytest_operator.plugin import OpsTest +from single_kernel_postgresql.config.literals import PEER_RELATION from tenacity import ( retry, stop_after_attempt, wait_exponential, ) -from constants import PEER - CHARM_BASE = "ubuntu@22.04" METADATA = yaml.safe_load(Path("./metadata.yaml").read_text()) DATABASE_APP_NAME = "postgresql" @@ -120,7 +119,7 @@ async def get_password( Returns: the user password. """ - secret = await get_secret_by_label(ops_test, label=f"{PEER}.{database_app_name}.app") + secret = await get_secret_by_label(ops_test, label=f"{PEER_RELATION}.{database_app_name}.app") password = secret.get(f"{username}-password") return password diff --git a/tests/integration/high_availability/high_availability_helpers_new.py b/tests/integration/high_availability/high_availability_helpers_new.py index 34b29d8..537cbed 100644 --- a/tests/integration/high_availability/high_availability_helpers_new.py +++ b/tests/integration/high_availability/high_availability_helpers_new.py @@ -8,10 +8,11 @@ from jubilant import Juju from jubilant.statustypes import Status, UnitStatus from pysyncobj.utility import TcpUtility +from single_kernel_postgresql.config.literals import PEER_RELATION from tenacity import Retrying, stop_after_delay, wait_fixed from yaml import safe_load -from constants import PEER, RAFT_PARTNER_PREFIX +from constants import RAFT_PARTNER_PREFIX from ..helpers import execute_queries_on_unit @@ -138,7 +139,7 @@ def wait_for_apps_status(jubilant_status_func: JujuAppsStatusFn, *apps: str) -> def get_user_password(juju: Juju, app_name: str, user: str) -> str | None: """Get a system user's password.""" for secret in juju.secrets(): - if secret.label == f"{PEER}.{app_name}.app": + if secret.label == f"{PEER_RELATION}.{app_name}.app": revealed_secret = juju.show_secret(secret.uri, reveal=True) return revealed_secret.content.get(f"{user}-password") diff --git a/tox.ini b/tox.ini index 6864dc7..b30be69 100644 --- a/tox.ini +++ b/tox.ini @@ -47,7 +47,7 @@ description = Run unit tests set_env = {[testenv]set_env} commands_pre = - poetry install --only main,charm-libs,unit --no-root + poetry install --only main,charm-libs,single-kernel,unit --no-root commands = poetry run coverage run --source={[vars]src_path} \ -m pytest -v --tb native -s {posargs} {[vars]tests_path}/unit @@ -66,6 +66,6 @@ pass_env = LANDSCAPE_ACCOUNT_NAME LANDSCAPE_REGISTRATION_KEY commands_pre = - poetry install --only integration --no-root + poetry install --only integration,single-kernel --no-root commands = poetry run pytest -v --tb native --log-cli-level=INFO -s --ignore={[vars]tests_path}/unit/ {posargs} From 0f0f81e88c289f2556f2e0f03f536d57454e772b Mon Sep 17 00:00:00 2001 From: Marcelo Henrique Neppel Date: Mon, 22 Jun 2026 17:30:29 -0300 Subject: [PATCH 4/6] fix(integration): install single-kernel without the postgresql extra The integration tox env was changed to `poetry install --only integration,single-kernel`, which installs postgresql-charms-single-kernel with its `postgresql` extra. That extra requires source `psycopg2`, which publishes no Linux wheels and therefore compiles from source, needing `pg_config`. The ubuntu-24.04-arm CI runners do not ship `pg_config`, so every arm64 integration job failed at dependency installation with `pg_config executable not found`, before any charm was deployed; the amd64 jobs passed only because their runner image bundles PostgreSQL. The 16.2.2 -> 16.3.0 bump itself is not the cause. Integration tests only consume the lib's pure-stdlib config.literals (PEER_RELATION) plus the `psycopg2` module already provided by `psycopg2-binary` (which has an aarch64 wheel); they never touch the extra's runtime dependencies. Keep the `postgresql` extra in the single-kernel group, which the unit env and the charmcraft poetry export still need (the charm imports single_kernel_postgresql.utils, which pulls httpx), and depend on the bare lib in the integration group so arm64 no longer builds psycopg2 from source. Signed-off-by: Marcelo Henrique Neppel --- poetry.lock | 8 ++++---- pyproject.toml | 5 +++++ tox.ini | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index b1b7e0c..06dd14e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1580,7 +1580,7 @@ version = "1.42.1" description = "OpenTelemetry Python API" optional = false python-versions = ">=3.10" -groups = ["main", "single-kernel"] +groups = ["main", "integration", "single-kernel"] files = [ {file = "opentelemetry_api-1.42.1-py3-none-any.whl", hash = "sha256:51a69edacadbc03a8950ace1c4c21099cacc538820ac2c9e36277e78cebba714"}, {file = "opentelemetry_api-1.42.1.tar.gz", hash = "sha256:56c63bea9f77b62856be8c47600474acad853b2924b99b1687c4cb6297166716"}, @@ -1595,7 +1595,7 @@ version = "3.7.1" description = "The Python library behind great charms" optional = false python-versions = ">=3.10" -groups = ["main", "single-kernel"] +groups = ["main", "integration", "single-kernel"] files = [ {file = "ops-3.7.1-py3-none-any.whl", hash = "sha256:559dc6770e551da5f4b9686a5605ed927c140182eb38bcc31c1c531c2f98923a"}, {file = "ops-3.7.1.tar.gz", hash = "sha256:1765bf6d1cff376ea27608542e183b055c89f2c5f54bca602072bcc817195abc"}, @@ -1721,7 +1721,7 @@ version = "16.3.0" description = "Shared and reusable code for PostgreSQL-related charms" optional = false python-versions = "<4.0,>=3.8" -groups = ["single-kernel"] +groups = ["integration", "single-kernel"] files = [ {file = "postgresql_charms_single_kernel-16.3.0-py3-none-any.whl", hash = "sha256:3f0a392b3f26ce3676ac365b49f25baa6ac812f82143c517689935f42114efbd"}, {file = "postgresql_charms_single_kernel-16.3.0.tar.gz", hash = "sha256:7e0d7db80d0b1a5a97baf002809c101d55e4ffe5b9f26a3ae20b9b150c6ae51e"}, @@ -3024,4 +3024,4 @@ h11 = ">=0.16.0,<1" [metadata] lock-version = "2.1" python-versions = ">=3.12,<4.0" -content-hash = "9c18b89d5dc55c1831a045ca76926ad4821e5639e31e1e6d2edc1c2e1e116958" +content-hash = "540eda3e253d1083d9badf0f530f25734132788afbfef38d4dd833a664a409b6" diff --git a/pyproject.toml b/pyproject.toml index 877145a..7642555 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,6 +54,11 @@ tomli-w = "^1.2.0" optional = true [tool.poetry.group.integration.dependencies] +# Imported without the "postgresql" extra: integration tests only use the lib's +# config.literals (e.g. PEER_RELATION), which is pure-stdlib. The extra would pull +# psycopg2 (source) -> needs pg_config and fails on arm64 runners. psycopg2-binary +# below already provides the psycopg2 module the tests import. +postgresql-charms-single-kernel = "16.3.0" pytest = "^9.1.0" pytest-operator = "^0.43.2" # renovate caret doesn't work: https://github.com/renovatebot/renovate/issues/26940 diff --git a/tox.ini b/tox.ini index b30be69..ad6c0ba 100644 --- a/tox.ini +++ b/tox.ini @@ -66,6 +66,6 @@ pass_env = LANDSCAPE_ACCOUNT_NAME LANDSCAPE_REGISTRATION_KEY commands_pre = - poetry install --only integration,single-kernel --no-root + poetry install --only integration --no-root commands = poetry run pytest -v --tb native --log-cli-level=INFO -s --ignore={[vars]tests_path}/unit/ {posargs} From 62caa046213fa5492bd5e2393fbde112a4de14d6 Mon Sep 17 00:00:00 2001 From: Marcelo Henrique Neppel Date: Wed, 24 Jun 2026 16:11:54 -0300 Subject: [PATCH 5/6] docs(deps): drop arch-specific wording from the no-extra rationale The comment claimed the postgresql extra "fails on arm64 runners", but the extra pulls psycopg2 from source, which needs pg_config and a C toolchain to build on any architecture -- it is not an arm64-specific limitation. State the reason as the source-build dependency it actually is, so it is not mistaken for an architecture quirk. Signed-off-by: Marcelo Henrique Neppel --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index e66d33f..74f2ef6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,7 +56,7 @@ optional = true [tool.poetry.group.integration.dependencies] # Imported without the "postgresql" extra: integration tests only use the lib's # config.literals (e.g. PEER_RELATION), which is pure-stdlib. The extra would pull -# psycopg2 (source) -> needs pg_config and fails on arm64 runners. psycopg2-binary +# psycopg2 (source), which must be compiled (it needs pg_config); psycopg2-binary # below already provides the psycopg2 module the tests import. postgresql-charms-single-kernel = "16.3.0" pytest = "^9.1.1" From e106a2495932e32bad29118f982693ff4a8eeac5 Mon Sep 17 00:00:00 2001 From: Marcelo Henrique Neppel Date: Wed, 24 Jun 2026 17:17:52 -0300 Subject: [PATCH 6/6] refactor(deps): declare single-kernel once via a bare dependency The library was declared twice -- with the postgresql extra in the single-kernel group (the charm build needs the extra's runtime deps) and again without it in the integration group (which must not pull the extra's source psycopg2). Poetry activates an extra for every install scope selecting a group that carries it, so the two forms could not be merged directly. Pin the library once, bare, in the single-kernel group; declare the extra's runtime deps the build needs (charmlibs-pathops, charmlibs-rollingops, charmlibs-interfaces-tls-certificates, data-platform-helpers, httpx, tomli) in the build-only charm-libs group; and install the shared single-kernel group in the integration env instead of re-declaring the library. The charm build closure is unchanged and integration still avoids source psycopg2. Signed-off-by: Marcelo Henrique Neppel --- poetry.lock | 110 ++++++++++++++++++++++--------------------------- pyproject.toml | 20 ++++++--- tox.ini | 2 +- 3 files changed, 64 insertions(+), 68 deletions(-) diff --git a/poetry.lock b/poetry.lock index 03db557..9efcafc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -54,7 +54,7 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" -groups = ["charm-libs", "single-kernel"] +groups = ["charm-libs"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -66,7 +66,7 @@ version = "4.14.0" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.10" -groups = ["main", "single-kernel"] +groups = ["main", "charm-libs"] files = [ {file = "anyio-4.14.0-py3-none-any.whl", hash = "sha256:dd9b7a2a9799ed6552fde617b2c5df02b7fdd7d88392fc48101e51bae46164d9"}, {file = "anyio-4.14.0.tar.gz", hash = "sha256:b47c1f9ccf73e67021df785332508f99379c68fa7d0684e8e3492cb1d4b23f89"}, @@ -247,7 +247,7 @@ version = "2026.6.17" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "charm-libs", "integration"] files = [ {file = "certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db"}, {file = "certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432"}, @@ -259,7 +259,7 @@ version = "2.0.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.9" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "charm-libs", "integration"] markers = "platform_python_implementation != \"PyPy\"" files = [ {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, @@ -357,7 +357,7 @@ version = "0.1.3" description = "" optional = false python-versions = ">=3.8" -groups = ["main", "single-kernel"] +groups = ["main"] files = [ {file = "charm_api-0.1.3-py3-none-any.whl", hash = "sha256:4dba74e33f3de4608e88db2e08e41b0681221e7d3c2cd6913e0ebeb3dbdf8d92"}, {file = "charm_api-0.1.3.tar.gz", hash = "sha256:a90a926b89fce834e9fb2184b96e07ec46f4dd56f3cd50e0209c0fd0ff35a29e"}, @@ -369,7 +369,7 @@ version = "0.1.2" description = "" optional = false python-versions = ">=3.8" -groups = ["main", "single-kernel"] +groups = ["main"] files = [ {file = "charm_json-0.1.2-py3-none-any.whl", hash = "sha256:1cad028a92831c61d6dcb99127c5216c333f90ec58d06b9f73fd0fd7355d1b3c"}, {file = "charm_json-0.1.2.tar.gz", hash = "sha256:f91255858cd6721ec491d09450f37a0cdecf1addbfcfbd41f3e27c58dd95092e"}, @@ -384,7 +384,7 @@ version = "3.1.1.4" description = "In-place rolling refreshes (upgrades) of stateful charmed applications" optional = false python-versions = ">=3.8" -groups = ["main", "single-kernel"] +groups = ["main"] files = [ {file = "charm_refresh-3.1.1.4-py3-none-any.whl", hash = "sha256:6ff6e04170c03b3fe3f23bbf32a288a0de3da0d44bf2e8dd850ee02925bf2ec6"}, {file = "charm_refresh-3.1.1.4.tar.gz", hash = "sha256:d33f66e5b65fd356a30bfbc634710e5538086199da93c30c86246370a66570be"}, @@ -422,7 +422,7 @@ version = "1.8.3" description = "The charmlibs.interfaces.tls_certificates package." optional = false python-versions = ">=3.10" -groups = ["single-kernel"] +groups = ["charm-libs"] files = [ {file = "charmlibs_interfaces_tls_certificates-1.8.3-py3-none-any.whl", hash = "sha256:fa0aa150b4e4513d439c7afb7eb0ceaf00363671143b27b09382758deea8a0cc"}, {file = "charmlibs_interfaces_tls_certificates-1.8.3.tar.gz", hash = "sha256:6bc35ee330681f2e0c58cf67e41133b144f3281f73d27293714c9ca918ee7cbc"}, @@ -439,7 +439,7 @@ version = "1.3.0.post0" description = "A pathlib-like interface for Juju K8s charms to interact with files in their workload container." optional = false python-versions = ">=3.10" -groups = ["single-kernel"] +groups = ["charm-libs"] files = [ {file = "charmlibs_pathops-1.3.0.post0-py3-none-any.whl", hash = "sha256:c6fc3e3460ffa03a7d4273cc7784c9d74378609a098c728cd9bbb2ed90bdfa5b"}, {file = "charmlibs_pathops-1.3.0.post0.tar.gz", hash = "sha256:36ac11b0c7c55b71341a549a1803f5c8d61c2279204862b8d50736041b782f59"}, @@ -454,7 +454,7 @@ version = "1.1.1" description = "The charmlibs.rollingops package." optional = false python-versions = ">=3.12" -groups = ["single-kernel"] +groups = ["charm-libs"] files = [ {file = "charmlibs_rollingops-1.1.1-py3-none-any.whl", hash = "sha256:1e61347c7792ec11afefa60d36f77a5afccf867832854d5aeef2da0b536afec4"}, {file = "charmlibs_rollingops-1.1.1.tar.gz", hash = "sha256:831457d2ef12117794f89a483ee9a5c347cb209a87dafe82907e9dede7d4641c"}, @@ -475,7 +475,7 @@ version = "1.0.1.post0" description = "The charmlibs.snap package." optional = false python-versions = ">=3.10" -groups = ["main", "single-kernel"] +groups = ["main"] files = [ {file = "charmlibs_snap-1.0.1.post0-py3-none-any.whl", hash = "sha256:655041096952c63e92c8d25a6183149f0594d4888be4be62a9635cb96897aa01"}, {file = "charmlibs_snap-1.0.1.post0.tar.gz", hash = "sha256:1e8da752ee405aa981665da8c4772016236baf80d2d902b02ec8c1c640fb2844"}, @@ -502,7 +502,7 @@ version = "3.4.7" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "integration"] files = [ {file = "charset_normalizer-3.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d"}, {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8"}, @@ -776,7 +776,7 @@ version = "49.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.9" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "charm-libs", "integration"] files = [ {file = "cryptography-49.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db"}, {file = "cryptography-49.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db"}, @@ -838,7 +838,7 @@ version = "1.1.0" description = "" optional = false python-versions = "<4.0,>=3.10" -groups = ["single-kernel"] +groups = ["charm-libs"] files = [ {file = "data_platform_helpers-1.1.0-py3-none-any.whl", hash = "sha256:71b2c2ba31d1bc01c55c9da82d02b0cb654b99231172916722ecaf4c469d27c4"}, {file = "data_platform_helpers-1.1.0.tar.gz", hash = "sha256:7539ef1c1047fec36ee8298aa4c75fe2bb36419544193b691805c12ca407a797"}, @@ -871,7 +871,7 @@ version = "1.0.0" description = "The dpcharmlibs.interfaces package." optional = false python-versions = ">=3.10" -groups = ["single-kernel"] +groups = ["charm-libs"] files = [ {file = "dpcharmlibs_interfaces-1.0.0-py3-none-any.whl", hash = "sha256:afff80be30e3ff8c31f68557946e9d5959247f1973cbc00e96da55b095f95a21"}, {file = "dpcharmlibs_interfaces-1.0.0.tar.gz", hash = "sha256:a177653019781a7a165be52cf4293134ee58912cd93686082cdd82da347a3bed"}, @@ -945,7 +945,7 @@ version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.8" -groups = ["main", "single-kernel"] +groups = ["main", "charm-libs"] files = [ {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, @@ -957,7 +957,7 @@ version = "4.3.0" description = "Pure-Python HTTP/2 protocol implementation" optional = false python-versions = ">=3.9" -groups = ["main", "single-kernel"] +groups = ["main"] files = [ {file = "h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd"}, {file = "h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1"}, @@ -973,7 +973,7 @@ version = "4.1.0" description = "Pure-Python HPACK header encoding" optional = false python-versions = ">=3.9" -groups = ["main", "single-kernel"] +groups = ["main"] files = [ {file = "hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496"}, {file = "hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca"}, @@ -985,7 +985,7 @@ version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" -groups = ["main", "single-kernel"] +groups = ["main", "charm-libs"] files = [ {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, @@ -1007,7 +1007,7 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" -groups = ["main", "single-kernel"] +groups = ["main", "charm-libs"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -1033,7 +1033,7 @@ version = "0.9.0" description = "WebSockets support for HTTPX" optional = false python-versions = ">=3.10" -groups = ["main", "single-kernel"] +groups = ["main"] files = [ {file = "httpx_ws-0.9.0-py3-none-any.whl", hash = "sha256:71640d2fb1bf9a225775015b33cd755cfd4c5f7e21c885192fe3adc4c387b248"}, {file = "httpx_ws-0.9.0.tar.gz", hash = "sha256:797373326f70eec1ae96f6e43ae9f12002fd7d73aee139a4985eaab964338a08"}, @@ -1069,7 +1069,7 @@ version = "6.1.0" description = "Pure-Python HTTP/2 framing" optional = false python-versions = ">=3.9" -groups = ["main", "single-kernel"] +groups = ["main"] files = [ {file = "hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5"}, {file = "hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08"}, @@ -1081,7 +1081,7 @@ version = "3.18" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.9" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "charm-libs", "integration"] files = [ {file = "idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2"}, {file = "idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848"}, @@ -1203,7 +1203,7 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "integration"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1330,7 +1330,7 @@ version = "0.21.0" description = "Lightweight kubernetes client library" optional = false python-versions = ">=3.8" -groups = ["main", "single-kernel"] +groups = ["main"] files = [ {file = "lightkube-0.21.0-py3-none-any.whl", hash = "sha256:5218c9a7029b5ba8a3e90534141795c6bb3ec3e96894afccb55f0581ca8d59b2"}, {file = "lightkube-0.21.0.tar.gz", hash = "sha256:720910200de4bd88e0d7b5d2edfb45a4f6be292798b8776d7b551ef5a5ccdc15"}, @@ -1351,7 +1351,7 @@ version = "1.35.0.8" description = "Models and Resources for lightkube module" optional = false python-versions = ">=3.9" -groups = ["main", "single-kernel"] +groups = ["main"] files = [ {file = "lightkube_models-1.35.0.8-py3-none-any.whl", hash = "sha256:d01fce42f96baf47a77a571bff59d6a513e96ae043fc03cfaaaaf79c609c4441"}, {file = "lightkube_models-1.35.0.8.tar.gz", hash = "sha256:dbc624596a7d94e6c43c5deda972be964202e0e8f26e2ab8e61d589d710b5e22"}, @@ -1383,7 +1383,7 @@ version = "4.2.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.10" -groups = ["single-kernel"] +groups = ["charm-libs"] files = [ {file = "markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a"}, {file = "markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49"}, @@ -1407,7 +1407,7 @@ version = "3.0.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "integration"] files = [ {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, @@ -1524,7 +1524,7 @@ version = "0.1.2" description = "Markdown URL utilities" optional = false python-versions = ">=3.7" -groups = ["single-kernel"] +groups = ["charm-libs"] files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -1565,7 +1565,7 @@ version = "1.42.1" description = "OpenTelemetry Python API" optional = false python-versions = ">=3.10" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "charm-libs", "single-kernel"] files = [ {file = "opentelemetry_api-1.42.1-py3-none-any.whl", hash = "sha256:51a69edacadbc03a8950ace1c4c21099cacc538820ac2c9e36277e78cebba714"}, {file = "opentelemetry_api-1.42.1.tar.gz", hash = "sha256:56c63bea9f77b62856be8c47600474acad853b2924b99b1687c4cb6297166716"}, @@ -1580,7 +1580,7 @@ version = "3.7.1" description = "The Python library behind great charms" optional = false python-versions = ">=3.10" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "charm-libs", "single-kernel"] files = [ {file = "ops-3.7.1-py3-none-any.whl", hash = "sha256:559dc6770e551da5f4b9686a5605ed927c140182eb38bcc31c1c531c2f98923a"}, {file = "ops-3.7.1.tar.gz", hash = "sha256:1765bf6d1cff376ea27608542e183b055c89f2c5f54bca602072bcc817195abc"}, @@ -1601,7 +1601,7 @@ version = "26.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "build-refresh-version", "integration", "single-kernel", "unit"] +groups = ["main", "build-refresh-version", "integration", "unit"] files = [ {file = "packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e"}, {file = "packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661"}, @@ -1706,27 +1706,15 @@ version = "16.3.0" description = "Shared and reusable code for PostgreSQL-related charms" optional = false python-versions = "<4.0,>=3.8" -groups = ["integration", "single-kernel"] +groups = ["single-kernel"] files = [ {file = "postgresql_charms_single_kernel-16.3.0-py3-none-any.whl", hash = "sha256:3f0a392b3f26ce3676ac365b49f25baa6ac812f82143c517689935f42114efbd"}, {file = "postgresql_charms_single_kernel-16.3.0.tar.gz", hash = "sha256:7e0d7db80d0b1a5a97baf002809c101d55e4ffe5b9f26a3ae20b9b150c6ae51e"}, ] [package.dependencies] -charm-refresh = {version = "*", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} -charmlibs-interfaces-tls-certificates = {version = ">=1.8.3", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} -charmlibs-pathops = {version = ">=1.0.1", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} -charmlibs-rollingops = {version = ">=1.1.1", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} -charmlibs-snap = {version = ">=1.0.1", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} -data-platform-helpers = {version = ">=0.1.7", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} -httpx = {version = "*", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} -jinja2 = {version = ">=3.1.6", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} ops = ">=2.0.0" -psycopg2 = {version = ">=2.9.10", optional = true, markers = "extra == \"postgresql\""} -pydantic = {version = ">=2.0", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} -requests = {version = "*", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} tenacity = ">=9.0.0" -tomli = {version = "*", optional = true, markers = "python_full_version >= \"3.12.0\" and extra == \"postgresql\""} [package.extras] postgresql = ["charm-refresh ; python_full_version >= \"3.12.0\"", "charmlibs-interfaces-tls-certificates (>=1.8.3) ; python_full_version >= \"3.12.0\"", "charmlibs-pathops (>=1.0.1) ; python_full_version >= \"3.12.0\"", "charmlibs-rollingops (>=1.1.1) ; python_full_version >= \"3.12.0\"", "charmlibs-snap (>=1.0.1) ; python_full_version >= \"3.12.0\"", "data-platform-helpers (>=0.1.7) ; python_full_version >= \"3.12.0\"", "httpx ; python_full_version >= \"3.12.0\"", "jinja2 (>=3.1.6) ; python_full_version >= \"3.12.0\"", "psycopg2 (>=2.9.10)", "pydantic (>=2.0) ; python_full_version >= \"3.12.0\"", "requests ; python_full_version >= \"3.12.0\"", "tomli ; python_full_version >= \"3.12.0\""] @@ -1806,7 +1794,7 @@ version = "2.9.12" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false python-versions = ">=3.9" -groups = ["main", "single-kernel"] +groups = ["main"] files = [ {file = "psycopg2-2.9.12-cp310-cp310-win_amd64.whl", hash = "sha256:d5fbe092315fb007c03544704e6d1e678a6c0378139d01cea433dc59edf041b4"}, {file = "psycopg2-2.9.12-cp311-cp311-win_amd64.whl", hash = "sha256:2532c0cdc6ad18c9c35cd935cc3159712e14f05276a6d29a6435c52d24b840c1"}, @@ -1955,7 +1943,7 @@ version = "3.0" description = "C parser in Python" optional = false python-versions = ">=3.10" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "charm-libs", "integration"] markers = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"" files = [ {file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"}, @@ -1968,7 +1956,7 @@ version = "2.13.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.9" -groups = ["charm-libs", "single-kernel"] +groups = ["charm-libs"] files = [ {file = "pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba"}, {file = "pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6"}, @@ -1990,7 +1978,7 @@ version = "2.46.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.9" -groups = ["charm-libs", "single-kernel"] +groups = ["charm-libs"] files = [ {file = "pydantic_core-2.46.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a396dcc17e5a0b164dbe026896245a4fa9ff402edca1dff0be3d53a517f74de4"}, {file = "pydantic_core-2.46.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da4b951fe36dc7c3a1ccb4e3cd1747c3542b8c9ceede8fc86cae054e764485f5"}, @@ -2123,7 +2111,7 @@ version = "2.20.0" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.9" -groups = ["integration", "single-kernel", "unit"] +groups = ["charm-libs", "integration", "unit"] files = [ {file = "pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"}, {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"}, @@ -2310,7 +2298,7 @@ version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "charm-libs", "integration", "single-kernel"] files = [ {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, @@ -2410,7 +2398,7 @@ version = "2.34.2" description = "Python HTTP for Humans." optional = false python-versions = ">=3.10" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "integration"] files = [ {file = "requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0"}, {file = "requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed"}, @@ -2451,7 +2439,7 @@ version = "15.0.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false python-versions = ">=3.9.0" -groups = ["single-kernel"] +groups = ["charm-libs"] files = [ {file = "rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb"}, {file = "rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36"}, @@ -2638,7 +2626,7 @@ version = "1.0.13" description = "A generator library for concise, unambiguous and URL-safe UUIDs." optional = false python-versions = ">=3.6" -groups = ["single-kernel"] +groups = ["charm-libs"] files = [ {file = "shortuuid-1.0.13-py3-none-any.whl", hash = "sha256:a482a497300b49b4953e15108a7913244e1bb0d41f9d332f5e9925dba33a3c5a"}, {file = "shortuuid-1.0.13.tar.gz", hash = "sha256:3bb9cf07f606260584b1df46399c0b87dd84773e7b25912b7e391e30797c5e72"}, @@ -2682,7 +2670,7 @@ version = "9.1.4" description = "Retry code until it succeeds" optional = false python-versions = ">=3.10" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "charm-libs", "integration", "single-kernel"] files = [ {file = "tenacity-9.1.4-py3-none-any.whl", hash = "sha256:6095a360c919085f28c6527de529e76a06ad89b23659fa881ae0649b867a9d55"}, {file = "tenacity-9.1.4.tar.gz", hash = "sha256:adb31d4c263f2bd041081ab33b498309a57c77f9acf2db65aadf0898179cf93a"}, @@ -2698,7 +2686,7 @@ version = "2.4.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "charm-libs", "integration"] files = [ {file = "tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30"}, {file = "tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a"}, @@ -2864,7 +2852,7 @@ version = "0.4.2" description = "Runtime typing introspection tools" optional = false python-versions = ">=3.9" -groups = ["charm-libs", "single-kernel"] +groups = ["charm-libs"] files = [ {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, @@ -2879,7 +2867,7 @@ version = "2.7.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.10" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "integration"] files = [ {file = "urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897"}, {file = "urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c"}, @@ -2909,7 +2897,7 @@ version = "1.9.0" description = "WebSocket client for Python with low level API options" optional = false python-versions = ">=3.9" -groups = ["main", "integration", "single-kernel"] +groups = ["main", "charm-libs", "integration", "single-kernel"] files = [ {file = "websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef"}, {file = "websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98"}, @@ -2997,7 +2985,7 @@ version = "1.3.2" description = "Pure-Python WebSocket protocol implementation" optional = false python-versions = ">=3.10" -groups = ["main", "single-kernel"] +groups = ["main"] files = [ {file = "wsproto-1.3.2-py3-none-any.whl", hash = "sha256:61eea322cdf56e8cc904bd3ad7573359a242ba65688716b0710a5eb12beab584"}, {file = "wsproto-1.3.2.tar.gz", hash = "sha256:b86885dcf294e15204919950f666e06ffc6c7c114ca900b060d6e16293528294"}, @@ -3009,4 +2997,4 @@ h11 = ">=0.16.0,<1" [metadata] lock-version = "2.1" python-versions = ">=3.12,<4.0" -content-hash = "74099c0b70784e5a39f0cc8818c76f425c72c878e23d59b0a662ec59166ac677" +content-hash = "f9d2198450f44124af9cf4468acfc8fa09da56f40c9851f7af5aeef96ce230ed" diff --git a/pyproject.toml b/pyproject.toml index 74f2ef6..1be8a9f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,11 +20,20 @@ charmlibs-snap = "^1.0.1" charmlibs-systemd = "^1.0.0" [tool.poetry.group.single-kernel.dependencies] -postgresql-charms-single-kernel = {extras = ["postgresql"], version = "16.3.0"} +postgresql-charms-single-kernel = "16.3.0" [tool.poetry.group.charm-libs.dependencies] # data_platform_libs/v0/data_models.py pydantic = "*" +# single-kernel is pinned bare (no extra) in the single-kernel group, so the +# charm build declares the lib's "postgresql"-extra runtime deps that aren't +# already in main (see the library's optional-dependencies for the full set). +httpx = "*" +data-platform-helpers = ">=0.1.7" +charmlibs-pathops = ">=1.0.1" +charmlibs-interfaces-tls-certificates = ">=1.8.3" +charmlibs-rollingops = ">=1.1.1" +tomli = "^2.4.1" [tool.poetry.group.format] optional = true @@ -54,11 +63,10 @@ tomli-w = "^1.2.0" optional = true [tool.poetry.group.integration.dependencies] -# Imported without the "postgresql" extra: integration tests only use the lib's -# config.literals (e.g. PEER_RELATION), which is pure-stdlib. The extra would pull -# psycopg2 (source), which must be compiled (it needs pg_config); psycopg2-binary -# below already provides the psycopg2 module the tests import. -postgresql-charms-single-kernel = "16.3.0" +# single-kernel itself (bare, no extra) is installed via the shared single-kernel +# group (see tox.ini); the tests only import its pure-stdlib config.literals. +# psycopg2-binary provides the psycopg2 module the tests import without building +# the source psycopg2 the lib's postgresql extra would pull in. pytest = "^9.1.1" pytest-operator = "^0.43.2" # renovate caret doesn't work: https://github.com/renovatebot/renovate/issues/26940 diff --git a/tox.ini b/tox.ini index ad6c0ba..b30be69 100644 --- a/tox.ini +++ b/tox.ini @@ -66,6 +66,6 @@ pass_env = LANDSCAPE_ACCOUNT_NAME LANDSCAPE_REGISTRATION_KEY commands_pre = - poetry install --only integration --no-root + poetry install --only integration,single-kernel --no-root commands = poetry run pytest -v --tb native --log-cli-level=INFO -s --ignore={[vars]tests_path}/unit/ {posargs}