Skip to content

tests: add reproducer for reactive plugin missing .build.manifest (#872)#2664

Draft
lengau wants to merge 3 commits intomainfrom
test/reproducer-issue-872
Draft

tests: add reproducer for reactive plugin missing .build.manifest (#872)#2664
lengau wants to merge 3 commits intomainfrom
test/reproducer-issue-872

Conversation

@lengau
Copy link
Copy Markdown
Collaborator

@lengau lengau commented Apr 22, 2026

Summary

Adds a failing unit test that reproduces #872: when building a reactive charm, the .build.manifest file generated by charm build is not copied into the install directory.

Bug

When charm build runs, it places .build.manifest in the build_dir/ root alongside the charm subdirectory. The reactive plugin only symlinks build_dir/<charm_name>/ into install_dir/, so .build.manifest is never included in the .charm artifact.

Reproducer

uv run python -m pytest tests/unit/parts/plugins/test_reactive.py::test_build_includes_build_manifest -v

The test fails with:

AssertionError: .build.manifest generated by charm build must be present in the install directory

Closes #872

bepri and others added 2 commits April 21, 2026 17:51
Add a failing test that demonstrates the reactive charm plugin does not
copy the .build.manifest file generated by 'charm build' into the
install directory. This file contains valuable build metadata (layer
commit hashes, pip packages from wheelhouse).

Closes #872

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions
Copy link
Copy Markdown

Type checking with ty failed. This is a notification only and does not require action.

Command output
error[invalid-assignment]: Object of type `None` is not assignable to `<module 'pwd'>`
  --> charmcraft/application/commands/init.py:33:5
   |
33 |     pwd = None  # type: ignore[assignment]
   |     ---   ^^^^ Incompatible value of type `None`
   |     |
   |     Declared type `<module 'pwd'>`
   |

error[unresolved-attribute]: Attribute `bases` is not defined on `PlatformCharm` in union `PlatformCharm | BasesCharm`
   --> charmcraft/application/commands/lifecycle.py:119:36
    |
119 |         len_configured_bases = len(project.bases)
    |                                    ^^^^^^^^^^^^^
    |

error[unresolved-attribute]: Object of type `AppService | type[AppService]` has no attribute `get_credentials`
   --> charmcraft/application/commands/store.py:210:27
    |
210 |             credentials = self._services.store.get_credentials(
    |                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |

error[unresolved-attribute]: Object of type `AppService | type[AppService]` has no attribute `login`
   --> charmcraft/application/commands/store.py:218:13
    |
218 |             self._services.store.login(packages=packages, **kwargs)
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |

error[unresolved-attribute]: Object of type `AppService | type[AppService]` has no attribute `get_account_info`
   --> charmcraft/application/commands/store.py:219:24
    |
219 |             username = self._services.store.get_account_info()["username"]
    |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |

error[unresolved-attribute]: Object of type `AppService | type[AppService]` has no attribute `logout`
   --> charmcraft/application/commands/store.py:244:13
    |
244 |             self._services.store.logout()
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |

error[not-iterable]: Object of type `IO[str] | None` may not be iterable
   --> charmcraft/charm_builder.py:423:17
    |
423 |     for line in proc.stdout:  # pyright: ignore[reportOptionalIterable]
    |                 ^^^^^^^^^^^
    |
info: It may not have an `__iter__` method and it doesn't have a `__getitem__` method

error[unresolved-attribute]: Attribute `split` is not defined on `None` in union `str | None`
   --> charmcraft/linters.py:238:23
    |
238 |                 yield node.module.split(".")
    |                       ^^^^^^^^^^^^^^^^^
    |

error[unsupported-operator]: Unsupported `>=` operation
   --> charmcraft/linters.py:793:16
    |
793 |             if version >= cls.get_version_tuple(match.group(1)):
    |                -------^^^^-------------------------------------
    |                |
    |                Both operands have type `tuple[int | str, ...]`
    |
info: Operation fails because operator `>=` is not supported between objects of type `int` and `str`

error[invalid-argument-type]: Argument to `Timer.__init__` is incorrect
   --> charmcraft/parts/lifecycle.py:111:29
    |
111 | …                     step=act.step.name,  # type: ignore[arg-type]
    |                       ^^^^^^^^^^^^^^^^^^ Expected `dict[str, Any]`, found `Literal["PULL", "OVERLAY", "BUILD", "STAGE", "PRIME"]`
    |
info: element `Literal["PULL"]` of union `Literal["PULL", "OVERLAY", "BUILD", "STAGE", "PRIME"]` is not assignable to `dict[str, Any]`
info: Method defined here
   --> charmcraft/instrum.py:129:9
    |
129 |     def __init__(self, msg: str, **extra_info: dict[str, Any]):
    |         ^^^^^^^^                 ---------------------------- Parameter declared here
    |

error[invalid-argument-type]: Argument to `Timer.__init__` is incorrect
   --> charmcraft/parts/lifecycle.py:112:29
    |
112 | …                     part=act.part_name,  # type: ignore[arg-type]
    |                       ^^^^^^^^^^^^^^^^^^ Expected `dict[str, Any]`, found `str`
    |
info: Method defined here
   --> charmcraft/instrum.py:129:9
    |
129 |     def __init__(self, msg: str, **extra_info: dict[str, Any]):
    |         ^^^^^^^^                 ---------------------------- Parameter declared here
    |

error[invalid-argument-type]: Argument to bound method `_Measurements.merge_from` is incorrect
   --> charmcraft/parts/plugins/_charm.py:341:28
    |
341 |         instrum.merge_from(env.get_charm_builder_metrics_path())
    |                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Expected `str`, found `Path`
    |
info: Method defined here
  --> charmcraft/instrum.py:77:9
   |
77 |     def merge_from(self, filename: str) -> None:
   |         ^^^^^^^^^^       ------------- Parameter declared here
   |

error[invalid-argument-type]: Argument is incorrect
   --> charmcraft/services/provider.py:124:13
    |
124 |             **kwargs,  # type: ignore[arg-type]
    |             ^^^^^^^^ Expected `bool`, found `bool | str | None`
    |
info: element `str` of union `bool | str | None` is not assignable to `bool`

error[invalid-argument-type]: Method `__getitem__` of type `bound method StoreErrorList.__getitem__(error_code: str) -> dict[str, str]` cannot be called with key of type `None` on object of type `StoreErrorList`
   --> charmcraft/services/store.py:375:16
    |
375 |             if exc.error_list[None]["message"] == (  # type: ignore[index]
    |                ^^^^^^^^^^^^^^
    |

error[unresolved-attribute]: Attribute `login` is not defined on `AnonymousClient` in union `Client | AnonymousClient`
   --> charmcraft/store/store.py:227:27
    |
227 |             credentials = self._client.login(**kwargs)
    |                           ^^^^^^^^^^^^^^^^^^
    |

error[unresolved-attribute]: Attribute `logout` is not defined on `AnonymousClient` in union `Client | AnonymousClient`
   --> charmcraft/store/store.py:241:9
    |
241 |         self._client.logout()
    |         ^^^^^^^^^^^^^^^^^^^
    |

error[unresolved-attribute]: Attribute `whoami` is not defined on `AnonymousClient` in union `Client | AnonymousClient`
   --> charmcraft/store/store.py:246:20
    |
246 |         response = self._client.whoami()
    |                    ^^^^^^^^^^^^^^^^^^^
    |

error[unresolved-attribute]: Attribute `whoami` is not defined on `AnonymousClient` in union `Client | AnonymousClient`
   --> charmcraft/store/store.py:268:9
    |
268 |         self._client.whoami()
    |         ^^^^^^^^^^^^^^^^^^^
    |

error[unresolved-attribute]: Attribute `unregister_name` is not defined on `AnonymousClient` in union `Client | AnonymousClient`
   --> charmcraft/store/store.py:285:9
    |
285 |         self._client.unregister_name(name)
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |

error[unresolved-attribute]: Attribute `push_file` is not defined on `AnonymousClient` in union `Client | AnonymousClient`
   --> charmcraft/store/store.py:311:21
    |
311 |         upload_id = self._client.push_file(filepath)
    |                     ^^^^^^^^^^^^^^^^^^^^^^
    |

error[unresolved-attribute]: Attribute `list_resource_revisions` is not defined on `AnonymousClient` in union `Client | AnonymousClient`
   --> charmcraft/store/store.py:506:16
    |
506 |         return self._client.list_resource_revisions(charm_name, resource_name)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |

error[invalid-argument-type]: Argument to function `add_representer` is incorrect
  --> charmcraft/utils/yaml.py:53:9
   |
53 |         _repr_str,  # type: ignore[arg-type]
   |         ^^^^^^^^^ Expected `(SafeDumper, AnyUrl | str, /) -> Node`, found `def _repr_str(dumper: SafeDumper, data: str) -> ScalarNode`
   |
info: the second parameter has an incompatible type: `AnyUrl | str` is not assignable to `str`
info: └── element `AnyUrl` of union `AnyUrl | str` is not assignable to `str`
info: Matching overload defined here
   --> .venv/lib/python3.12/site-packages/yaml-stubs/__init__.pyi:419:5
    |
419 | def add_representer(data_type: type[_T], representer: Callable[[_Representer, _T], Node], Dumper: type[_Representer]) -> None: ...
    |     ^^^^^^^^^^^^^^^                      ----------------------------------------------- Parameter declared here
    |
info: Non-matching overloads for function `add_representer`:
info:   [_T](data_type: type[_T], representer: (Dumper, _T, /) -> Node) -> None

error[invalid-argument-type]: Argument to constructor `Path.__new__` is incorrect
   --> docs/conf.py:336:30
    |
336 |     docs_path = pathlib.Path(docs_module.__file__).parent / library_name
    |                              ^^^^^^^^^^^^^^^^^^^^ Expected `str | PathLike[str]`, found `str | None`
    |
info: element `None` of union `str | None` is not assignable to `str | PathLike[str]`
info: └── type `None` is not assignable to any element of the union `str | PathLike[str]`
info:     ├── type `None` is not assignable to protocol `PathLike[str]`
info:     │   └── protocol member `__fspath__` is not defined on type `None`
info:     └── ... omitted 1 union element without additional context
info: Function defined here
   --> stdlib/pathlib/__init__.pyi:310:13
    |
310 |         def __new__(cls, *args: StrPath, **kwargs: Unused) -> Self: ...
    |             ^^^^^^^      -------------- Parameter declared here
    |

error[unresolved-import]: Cannot resolve imported module `ops`
  --> docs/howto/code/custom-action-clearsession/clearsession_action_charm.py:10:8
   |
10 | import ops
   |        ^^^
   |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `paas_charm.django`
  --> docs/howto/code/custom-action-clearsession/clearsession_action_charm.py:12:8
   |
12 | import paas_charm.django
   |        ^^^^^^^^^^^^^^^^^
   |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `flask`
 --> docs/howto/code/custom-action-updatelogfile/app.py:3:8
  |
3 | import flask
  |        ^^^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `ops`
  --> docs/howto/code/custom-action-updatelogfile/updatelogfile_action_charm.py:10:8
   |
10 | import ops
   |        ^^^
   |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `paas_charm.flask`
  --> docs/howto/code/custom-action-updatelogfile/updatelogfile_action_charm.py:12:8
   |
12 | import paas_charm.flask
   |        ^^^^^^^^^^^^^^^^
   |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `flask`
 --> docs/howto/code/flask-async/app.py:3:8
  |
3 | import flask
  |        ^^^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `django.contrib`
  --> docs/tutorial/code/django/urls_django_hello_world.py:17:6
   |
17 | from django.contrib import admin
   |      ^^^^^^^^^^^^^^
   |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `django.urls`
  --> docs/tutorial/code/django/urls_django_hello_world.py:18:6
   |
18 | from django.urls import include, path
   |      ^^^^^^^^^^^
   |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `django.urls`
 --> docs/tutorial/code/django/urls_greeting.py:1:6
  |
1 | from django.urls import path
  |      ^^^^^^^^^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Module `docs.tutorial.code.django` has no member `views`
 --> docs/tutorial/code/django/urls_greeting.py:3:15
  |
3 | from . import views
  |               ^^^^^
  |

error[unresolved-import]: Cannot resolve imported module `django.http`
 --> docs/tutorial/code/django/views_greeting.py:1:6
  |
1 | from django.http import HttpResponse
  |      ^^^^^^^^^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `django.http`
 --> docs/tutorial/code/django/views_greeting_configuration.py:3:6
  |
3 | from django.http import HttpResponse
  |      ^^^^^^^^^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Module `fastapi` has no member `FastAPI`
 --> docs/tutorial/code/fastapi/app.py:1:21
  |
1 | from fastapi import FastAPI
  |                     ^^^^^^^
  |

error[unresolved-import]: Module `fastapi` has no member `FastAPI`
 --> docs/tutorial/code/fastapi/greeting_app.py:3:21
  |
3 | from fastapi import FastAPI
  |                     ^^^^^^^
  |

error[unresolved-import]: Module `fastapi` has no member `FastAPI`
 --> docs/tutorial/code/fastapi/visitors_app.py:7:21
  |
7 | from fastapi import FastAPI, Header
  |                     ^^^^^^^
  |

error[unresolved-import]: Module `fastapi` has no member `Header`
 --> docs/tutorial/code/fastapi/visitors_app.py:7:30
  |
7 | from fastapi import FastAPI, Header
  |                              ^^^^^^
  |

error[unresolved-import]: Cannot resolve imported module `psycopg2`
 --> docs/tutorial/code/fastapi/visitors_app.py:8:8
  |
8 | import psycopg2
  |        ^^^^^^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `psycopg2`
 --> docs/tutorial/code/fastapi/visitors_migrate.py:5:8
  |
5 | import psycopg2
  |        ^^^^^^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-attribute]: Module `flask` has no member `Flask`
 --> docs/tutorial/code/flask/app.py:5:7
  |
5 | app = flask.Flask(__name__)
  |       ^^^^^^^^^^^
  |

error[unresolved-attribute]: Module `flask` has no member `Flask`
 --> docs/tutorial/code/flask/greeting_app.py:5:7
  |
5 | app = flask.Flask(__name__)
  |       ^^^^^^^^^^^
  |

error[unresolved-import]: Cannot resolve imported module `psycopg2`
 --> docs/tutorial/code/flask/visitors_app.py:7:8
  |
7 | import psycopg2
  |        ^^^^^^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-attribute]: Module `flask` has no member `Flask`
 --> docs/tutorial/code/flask/visitors_app.py:9:7
  |
9 | app = flask.Flask(__name__)
  |       ^^^^^^^^^^^
  |

error[unresolved-attribute]: Module `flask` has no member `request`
  --> docs/tutorial/code/flask/visitors_app.py:18:22
   |
18 |         user_agent = flask.request.headers.get('User-Agent')
   |                      ^^^^^^^^^^^^^
   |

error[unresolved-import]: Cannot resolve imported module `psycopg2`
 --> docs/tutorial/code/flask/visitors_migrate.py:5:8
  |
5 | import psycopg2
  |        ^^^^^^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[invalid-argument-type]: Argument is incorrect
  --> tests/__init__.py:36:65
   |
36 |     return models.resource_revision_model.CharmResourceRevision(**data)
   |                                                                 ^^^^^^ Expected `datetime | None`, found `list[Unknown] | datetime | str | int`
   |
info: element `list[Unknown]` of union `list[Unknown] | datetime | str | int` is not assignable to `datetime | None`

error[invalid-argument-type]: Argument is incorrect
  --> tests/__init__.py:36:65
   |
36 |     return models.resource_revision_model.CharmResourceRevision(**data)
   |                                                                 ^^^^^^ Expected `str | None`, found `list[Unknown] | datetime | str | int`
   |
info: element `list[Unknown]` of union `list[Unknown] | datetime | str | int` is not assignable to `str | None`

error[invalid-argument-type]: Argument is incorrect
    --> tests/commands/test_store_api.py:1628:13
     |
1628 |             api=test_api,
     |             ^^^^^^^^^^^^ Expected `int`, found `Literal["test-api-version"]`
     |

error[invalid-argument-type]: Argument is incorrect
    --> tests/commands/test_store_api.py:1634:13
     |
1634 |             patch=test_patch,
     |             ^^^^^^^^^^^^^^^^ Expected `int`, found `Literal["test-patch-version"]`
     |

error[invalid-argument-type]: Argument is incorrect
    --> tests/commands/test_store_api.py:1718:13
     |
1718 |             api=test_api_1,
     |             ^^^^^^^^^^^^^^ Expected `int`, found `Literal["test-api-version-1"]`
     |

error[invalid-argument-type]: Argument is incorrect
    --> tests/commands/test_store_api.py:1724:13
     |
1724 |             patch=test_patch_1,
     |             ^^^^^^^^^^^^^^^^^^ Expected `int`, found `Literal["test-patch-version-1"]`
     |

error[invalid-argument-type]: Argument is incorrect
    --> tests/commands/test_store_api.py:1727:13
     |
1727 |             api=test_api_2,
     |             ^^^^^^^^^^^^^^ Expected `int`, found `Literal["test-api-version-2"]`
     |

error[invalid-argument-type]: Argument is incorrect
    --> tests/commands/test_store_api.py:1733:13
     |
1733 |             patch=test_patch_2,
     |             ^^^^^^^^^^^^^^^^^^ Expected `int`, found `Literal["test-patch-version-2"]`
     |

error[invalid-method-override]: Invalid override of method `json`
   --> tests/commands/test_store_client.py:77:9
    |
 77 |       def json(self):
    |           ^^^^^^^^^^ Definition is incompatible with `Response.json`
    |
   ::: .venv/lib/python3.12/site-packages/requests-stubs/models.pyi:155:9
    |
155 |       def json(
    |  _________-
156 | |         self,
157 | |         *,
158 | |         cls: type[JSONDecoder] | None = ...,
159 | |         object_hook: Callable[[dict[Any, Any]], Any] | None = ...,
160 | |         parse_float: Callable[[str], Any] | None = ...,
161 | |         parse_int: Callable[[str], Any] | None = ...,
162 | |         parse_constant: Callable[[str], Any] | None = ...,
163 | |         object_pairs_hook: Callable[[list[tuple[Any, Any]]], Any] | None = ...,
164 | |         **kwds: Any,
165 | |     ) -> Any: ...
    | |____________- `Response.json` defined here
    |
info: This violates the Liskov Substitution Principle

error[invalid-argument-type]: Argument is incorrect
   --> tests/conftest.py:225:9
    |
225 |         build_on=arch,
    |         ^^^^^^^^^^^^^ Expected `DebianArchitecture`, found `str`
    |

error[invalid-argument-type]: Argument is incorrect
   --> tests/conftest.py:226:9
    |
226 |         build_for="arm64",
    |         ^^^^^^^^^^^^^^^^^ Expected `DebianArchitecture | Literal["all"]`, found `Literal["arm64"]`
    |

error[invalid-method-override]: Invalid override of method `get_supported_bases`
  --> tests/extensions/test_extensions.py:33:9
   |
33 |     def get_supported_bases(cls) -> list[tuple[str, ...]]:
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Definition is incompatible with `Extension.get_supported_bases`
   |
  ::: charmcraft/extensions/extension.py:52:9
   |
52 |     def get_supported_bases() -> list[tuple[str, str]]:
   |         ---------------------------------------------- `Extension.get_supported_bases` defined here
   |
info: `FakeExtension.get_supported_bases` is a classmethod but `Extension.get_supported_bases` is a staticmethod
info: incompatible return types: `list[tuple[str, ...]]` is not assignable to `list[tuple[str, str]]`
info: This violates the Liskov Substitution Principle

error[invalid-return-type]: Return type does not match returned value
  --> tests/extensions/test_extensions.py:33:37
   |
33 |     def get_supported_bases(cls) -> list[tuple[str, ...]]:
   |                                     --------------------- Expected `list[tuple[str, ...]]` because of return type
34 |         """Return a list of tuple of supported bases."""
35 |         return cls.bases
   |                ^^^^^^^^^ expected `list[tuple[str, ...]]`, found `list[tuple[str, str]]`
   |

error[invalid-method-override]: Invalid override of method `is_experimental`
  --> tests/extensions/test_extensions.py:38:9
   |
38 |     def is_experimental(_base: tuple[str, ...] | None) -> bool:
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Definition is incompatible with `Extension.is_experimental`
   |
  ::: charmcraft/extensions/extension.py:57:9
   |
57 |     def is_experimental(base: tuple[str, str] | None) -> bool:
   |         ----------------------------------------------------- `Extension.is_experimental` defined here
   |
info: the parameter named `_base` does not match `base` (and can be used as a keyword parameter)
info: This violates the Liskov Substitution Principle

error[invalid-method-override]: Invalid override of method `is_experimental`
  --> tests/extensions/test_extensions.py:62:9
   |
62 |     def is_experimental(_base: str | None) -> bool:
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Definition is incompatible with `FakeExtension.is_experimental`
   |
  ::: tests/extensions/test_extensions.py:38:9
   |
38 |     def is_experimental(_base: tuple[str, ...] | None) -> bool:
   |         ------------------------------------------------------ `FakeExtension.is_experimental` defined here
   |
info: parameter `_base` has an incompatible type: `tuple[str, ...] | None` is not assignable to `str | None`
info: └── element `tuple[str, ...]` of union `tuple[str, ...] | None` is not assignable to `str | None`
info: This violates the Liskov Substitution Principle

error[invalid-method-override]: Invalid override of method `is_experimental`
  --> tests/extensions/test_registry.py:34:9
   |
34 |     def is_experimental(_base: tuple[str, str] | None) -> bool:
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Definition is incompatible with `Extension.is_experimental`
   |
  ::: charmcraft/extensions/extension.py:57:9
   |
57 |     def is_experimental(base: tuple[str, str] | None) -> bool:
   |         ----------------------------------------------------- `Extension.is_experimental` defined here
   |
info: the parameter named `_base` does not match `base` (and can be used as a keyword parameter)
info: This violates the Liskov Substitution Principle

warning[possibly-missing-submodule]: Submodule `application` might not have been imported
  --> tests/integration/commands/test_init.py:75:17
   |
75 |         {"app": charmcraft.application.APP_METADATA, "services": None}
   |                 ^^^^^^^^^^^^^^^^^^^^^^
   |
help: Consider explicitly importing `charmcraft.application`

error[unresolved-attribute]: Object of type `RecordingEmitter` has no attribute `assert_json_output`
   --> tests/integration/commands/test_store_commands.py:225:9
    |
225 |         emitter.assert_json_output(  # pyright: ignore[reportAttributeAccessIssue]
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |

error[unresolved-attribute]: Unresolved attribute `client` on type `AppService`
  --> tests/integration/conftest.py:45:5
   |
45 |     factory.get("store").client = mock.Mock(spec_set=craft_store.StoreClient)  # pyright: ignore[reportAttributeAccessIssue]
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |

error[invalid-argument-type]: Argument to `AppService.__init__` is incorrect
  --> tests/integration/services/test_image.py:28:9
   |
28 |         services=None,  # pyright: ignore[reportArgumentType]
   |         ^^^^^^^^^^^^^ Expected `ServiceFactory`, found `None`
   |
info: Method defined here
  --> .venv/lib/python3.12/site-packages/craft_application/services/base.py:44:9
   |
44 |     def __init__(self, app: AppMetadata, services: ServiceFactory) -> None:
   |         ^^^^^^^^                         ------------------------ Parameter declared here
   |

error[invalid-argument-type]: Argument is incorrect
  --> tests/integration/services/test_lifecycle.py:40:17
   |
40 |                 build_for="invalid",  # pyright: ignore[reportArgumentType]
   |                 ^^^^^^^^^^^^^^^^^^^ Expected `DebianArchitecture | Literal["all"]`, found `Literal["invalid"]`
   |

error[invalid-argument-type]: Argument is incorrect
  --> tests/integration/services/test_lifecycle.py:88:17
   |
88 |                 build_for=f"{foreign_arch}-{host_arch}",  # pyright: ignore[reportArgumentType]
   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Expected `DebianArchitecture | Literal["all"]`, found `str`
   |

error[invalid-argument-type]: Argument is incorrect
  --> tests/integration/services/test_provider.py:56:28
   |
56 |     with provider.instance(**provider_kwargs):
   |                            ^^^^^^^^^^^^^^^^^ Expected `bool`, found `BuildInfo | Path`
   |
info: element `BuildInfo` of union `BuildInfo | Path` is not assignable to `bool`

error[invalid-argument-type]: Argument is incorrect
  --> tests/integration/services/test_provider.py:56:28
   |
56 |     with provider.instance(**provider_kwargs):
   |                            ^^^^^^^^^^^^^^^^^ Expected `bool`, found `BuildInfo | Path`
   |
info: element `BuildInfo` of union `BuildInfo | Path` is not assignable to `bool`

error[invalid-argument-type]: Argument is incorrect
  --> tests/integration/services/test_provider.py:56:28
   |
56 |     with provider.instance(**provider_kwargs):
   |                            ^^^^^^^^^^^^^^^^^ Expected `bool`, found `BuildInfo | Path`
   |
info: element `BuildInfo` of union `BuildInfo | Path` is not assignable to `bool`

error[invalid-argument-type]: Argument is incorrect
  --> tests/integration/services/test_provider.py:56:28
   |
56 |     with provider.instance(**provider_kwargs):
   |                            ^^^^^^^^^^^^^^^^^ Expected `str | None`, found `BuildInfo | Path`
   |
info: element `BuildInfo` of union `BuildInfo | Path` is not assignable to `str | None`

error[invalid-argument-type]: Argument is incorrect
  --> tests/integration/services/test_provider.py:56:28
   |
56 |     with provider.instance(**provider_kwargs):
   |                            ^^^^^^^^^^^^^^^^^ Expected `((Executor, /) -> None) | None`, found `BuildInfo | Path`
   |
info: element `BuildInfo` of union `BuildInfo | Path` is not assignable to `((Executor, /) -> None) | None`

error[invalid-argument-type]: Argument is incorrect
   --> tests/integration/services/test_provider.py:101:28
    |
101 |     with provider.instance(**provider_kwargs) as instance:
    |                            ^^^^^^^^^^^^^^^^^ Expected `bool`, found `BuildInfo | Path`
    |
info: element `BuildInfo` of union `BuildInfo | Path` is not assignable to `bool`

error[invalid-argument-type]: Argument is incorrect
   --> tests/integration/services/test_provider.py:101:28
    |
101 |     with provider.instance(**provider_kwargs) as instance:
    |                            ^^^^^^^^^^^^^^^^^ Expected `bool`, found `BuildInfo | Path`
    |
info: element `BuildInfo` of union `BuildInfo | Path` is not assignable to `bool`

error[invalid-argument-type]: Argument is incorrect
   --> tests/integration/services/test_provider.py:101:28
    |
101 |     with provider.instance(**provider_kwargs) as instance:
    |                            ^^^^^^^^^^^^^^^^^ Expected `bool`, found `BuildInfo | Path`
    |
info: element `BuildInfo` of union `BuildInfo | Path` is not assignable to `bool`

error[invalid-argument-type]: Argument is incorrect
   --> tests/integration/services/test_provider.py:101:28
    |
101 |     with provider.instance(**provider_kwargs) as instance:
    |                            ^^^^^^^^^^^^^^^^^ Expected `str | None`, found `BuildInfo | Path`
    |
info: element `BuildInfo` of union `BuildInfo | Path` is not assignable to `str | None`

error[invalid-argument-type]: Argument is incorrect
   --> tests/integration/services/test_provider.py:101:28
    |
101 |     with provider.instance(**provider_kwargs) as instance:
    |                            ^^^^^^^^^^^^^^^^^ Expected `((Executor, /) -> None) | None`, found `BuildInfo | Path`
    |
info: element `BuildInfo` of union `BuildInfo | Path` is not assignable to `((Executor, /) -> None) | None`

error[invalid-argument-type]: Argument is incorrect
   --> tests/integration/services/test_provider.py:134:28
    |
134 |     with provider.instance(**provider_kwargs) as instance:
    |                            ^^^^^^^^^^^^^^^^^ Expected `bool`, found `BuildInfo | Path`
    |
info: element `BuildInfo` of union `BuildInfo | Path` is not assignable to `bool`

error[invalid-argument-type]: Argument is incorrect
   --> tests/integration/services/test_provider.py:134:28
    |
134 |     with provider.instance(**provider_kwargs) as instance:
    |                            ^^^^^^^^^^^^^^^^^ Expected `bool`, found `BuildInfo | Path`
    |
info: element `BuildInfo` of union `BuildInfo | Path` is not assignable to `bool`

error[invalid-argument-type]: Argument is incorrect
   --> tests/integration/services/test_provider.py:134:28
    |
134 |     with provider.instance(**provider_kwargs) as instance:
    |                            ^^^^^^^^^^^^^^^^^ Expected `bool`, found `BuildInfo | Path`
    |
info: element `BuildInfo` of union `BuildInfo | Path` is not assignable to `bool`

error[invalid-argument-type]: Argument is incorrect
   --> tests/integration/services/test_provider.py:134:28
    |
134 |     with provider.instance(**provider_kwargs) as instance:
    |                            ^^^^^^^^^^^^^^^^^ Expected `str | None`, found `BuildInfo | Path`
    |
info: element `BuildInfo` of union `BuildInfo | Path` is not assignable to `str | None`

error[invalid-argument-type]: Argument is incorrect
   --> tests/integration/services/test_provider.py:134:28
    |
134 |     with provider.instance(**provider_kwargs) as instance:
    |                            ^^^^^^^^^^^^^^^^^ Expected `((Executor, /) -> None) | None`, found `BuildInfo | Path`
    |
info: element `BuildInfo` of union `BuildInfo | Path` is not assignable to `((Executor, /) -> None) | None`

error[unresolved-import]: Cannot resolve imported module `charm`
 --> tests/spread/commands/init-extensions/tests/unit/test_charm.py:9:8
  |
9 | import charm
  |        ^^^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `ops`
  --> tests/spread/commands/init-extensions/tests/unit/test_charm.py:10:6
   |
10 | from ops import testing
   |      ^^^
   |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `ops`
 --> tests/spread/dependencies/setuptools-scm-python/src/charm.py:9:8
  |
9 | import ops
  |        ^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `ops`
  --> tests/spread/dependencies/strict-dependencies-errors/extra-binary-packages/src/charm.py:17:8
   |
17 | import ops
   |        ^^^
   |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

warning[unused-type-ignore-comment]: Unused blanket `type: ignore` directive
   --> tests/spread/dependencies/strict-dependencies-errors/extra-binary-packages/src/charm.py:103:27
    |
103 |     ops.main(CharmCharm)  # type: ignore
    |                           ^^^^^^^^^^^^^^
    |
help: Remove the unused suppression comment
100 |
101 |
102 | if __name__ == "__main__":  # pragma: nocover
    -     ops.main(CharmCharm)  # type: ignore
103 +     ops.main(CharmCharm)

error[unresolved-import]: Cannot resolve imported module `ops`
  --> tests/spread/dependencies/strict-dependencies-errors/extra-packages/src/charm.py:17:8
   |
17 | import ops
   |        ^^^
   |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

warning[unused-type-ignore-comment]: Unused blanket `type: ignore` directive
   --> tests/spread/dependencies/strict-dependencies-errors/extra-packages/src/charm.py:103:27
    |
103 |     ops.main(CharmCharm)  # type: ignore
    |                           ^^^^^^^^^^^^^^
    |
help: Remove the unused suppression comment
100 |
101 |
102 | if __name__ == "__main__":  # pragma: nocover
    -     ops.main(CharmCharm)  # type: ignore
103 +     ops.main(CharmCharm)

error[unresolved-import]: Cannot resolve imported module `ops`
  --> tests/spread/dependencies/strict-dependencies-errors/missing-packages/src/charm.py:17:8
   |
17 | import ops
   |        ^^^
   |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

warning[unused-type-ignore-comment]: Unused blanket `type: ignore` directive
   --> tests/spread/dependencies/strict-dependencies-errors/missing-packages/src/charm.py:103:27
    |
103 |     ops.main(CharmCharm)  # type: ignore
    |                           ^^^^^^^^^^^^^^
    |
help: Remove the unused suppression comment
100 |
101 |
102 | if __name__ == "__main__":  # pragma: nocover
    -     ops.main(CharmCharm)  # type: ignore
103 +     ops.main(CharmCharm)

error[unresolved-import]: Cannot resolve imported module `ops`
  --> tests/spread/dependencies/strict-dependencies-errors/no-requirements/src/charm.py:17:8
   |
17 | import ops
   |        ^^^
   |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

warning[unused-type-ignore-comment]: Unused blanket `type: ignore` directive
   --> tests/spread/dependencies/strict-dependencies-errors/no-requirements/src/charm.py:103:27
    |
103 |     ops.main(CharmCharm)  # type: ignore
    |                           ^^^^^^^^^^^^^^
    |
help: Remove the unused suppression comment
100 |
101 |
102 | if __name__ == "__main__":  # pragma: nocover
    -     ops.main(CharmCharm)  # type: ignore
103 +     ops.main(CharmCharm)

error[unresolved-import]: Cannot resolve imported module `ops`
  --> tests/spread/dependencies/strict-dependencies/charm/src/charm.py:17:8
   |
17 | import ops
   |        ^^^
   |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

warning[unused-type-ignore-comment]: Unused blanket `type: ignore` directive
   --> tests/spread/dependencies/strict-dependencies/charm/src/charm.py:103:27
    |
103 |     ops.main(CharmCharm)  # type: ignore
    |                           ^^^^^^^^^^^^^^
    |
help: Remove the unused suppression comment
100 |
101 |
102 | if __name__ == "__main__":  # pragma: nocover
    -     ops.main(CharmCharm)  # type: ignore
103 +     ops.main(CharmCharm)

error[unresolved-import]: Module `charms.reactive` has no member `set_flag`
 --> tests/spread/smoketests/reactive/reactivecharm/reactive/reactivecharm.py:1:29
  |
1 | from charms.reactive import set_flag, when_not
  |                             ^^^^^^^^
  |

error[unresolved-import]: Module `charms.reactive` has no member `when_not`
 --> tests/spread/smoketests/reactive/reactivecharm/reactive/reactivecharm.py:1:39
  |
1 | from charms.reactive import set_flag, when_not
  |                                       ^^^^^^^^
  |

error[unresolved-import]: Cannot resolve imported module `ops`
  --> tests/spread/ubuntu-20.04/charm/bases/src/charm.py:18:8
   |
18 | import ops
   |        ^^^
   |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

warning[unused-type-ignore-comment]: Unused blanket `type: ignore` directive
   --> tests/spread/ubuntu-20.04/charm/bases/src/charm.py:104:32
    |
104 |     ops.main(BasicBasesCharm)  # type: ignore
    |                                ^^^^^^^^^^^^^^
    |
help: Remove the unused suppression comment
101 |
102 |
103 | if __name__ == "__main__":  # pragma: nocover
    -     ops.main(BasicBasesCharm)  # type: ignore
104 +     ops.main(BasicBasesCharm)

error[unresolved-import]: Cannot resolve imported module `ops`
 --> tests/spread/ubuntu-20.04/charm/platforms/src/charm.py:9:8
  |
9 | import ops
  |        ^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

warning[unused-type-ignore-comment]: Unused blanket `type: ignore` directive
  --> tests/spread/ubuntu-20.04/charm/platforms/src/charm.py:27:31
   |
27 |     ops.main(PlatformsCharm)  # type: ignore
   |                               ^^^^^^^^^^^^^^
   |
help: Remove the unused suppression comment
24 |
25 |
26 | if __name__ == "__main__":  # pragma: nocover
   -     ops.main(PlatformsCharm)  # type: ignore
27 +     ops.main(PlatformsCharm)

error[unresolved-import]: Cannot resolve imported module `ops`
  --> tests/spread/ubuntu-22.04/charm/bases/src/charm.py:18:8
   |
18 | import ops
   |        ^^^
   |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

warning[unused-type-ignore-comment]: Unused blanket `type: ignore` directive
   --> tests/spread/ubuntu-22.04/charm/bases/src/charm.py:104:32
    |
104 |     ops.main(BasicBasesCharm)  # type: ignore
    |                                ^^^^^^^^^^^^^^
    |
help: Remove the unused suppression comment
101 |
102 |
103 | if __name__ == "__main__":  # pragma: nocover
    -     ops.main(BasicBasesCharm)  # type: ignore
104 +     ops.main(BasicBasesCharm)

error[unresolved-import]: Cannot resolve imported module `ops`
 --> tests/spread/ubuntu-22.04/charm/platforms/src/charm.py:9:8
  |
9 | import ops
  |        ^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

warning[unused-type-ignore-comment]: Unused blanket `type: ignore` directive
  --> tests/spread/ubuntu-22.04/charm/platforms/src/charm.py:27:31
   |
27 |     ops.main(PlatformsCharm)  # type: ignore
   |                               ^^^^^^^^^^^^^^
   |
help: Remove the unused suppression comment
24 |
25 |
26 | if __name__ == "__main__":  # pragma: nocover
   -     ops.main(PlatformsCharm)  # type: ignore
27 +     ops.main(PlatformsCharm)

error[unresolved-import]: Cannot resolve imported module `ops`
 --> tests/spread/ubuntu-24.04/charm/platforms/src/charm.py:9:8
  |
9 | import ops
  |        ^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

warning[unused-type-ignore-comment]: Unused blanket `type: ignore` directive
  --> tests/spread/ubuntu-24.04/charm/platforms/src/charm.py:27:31
   |
27 |     ops.main(PlatformsCharm)  # type: ignore
   |                               ^^^^^^^^^^^^^^
   |
help: Remove the unused suppression comment
24 |
25 |
26 | if __name__ == "__main__":  # pragma: nocover
   -     ops.main(PlatformsCharm)  # type: ignore
27 +     ops.main(PlatformsCharm)

error[unresolved-import]: Cannot resolve imported module `ops`
 --> tests/spread/ubuntu-24.04/test-cmd/src/charm.py:6:8
  |
6 | import ops
  |        ^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `pytest_operator.plugin`
 --> tests/spread/ubuntu-24.04/test-cmd/tests/integration/test_charm.py:7:6
  |
7 | from pytest_operator.plugin import OpsTest
  |      ^^^^^^^^^^^^^^^^^^^^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `ops`
 --> tests/spread/ubuntu-24.04/test-cmd/tests/unit/test_charm.py:2:6
  |
2 | from ops import testing
  |      ^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Module `charm` has no member `TestCmdCharm`
 --> tests/spread/ubuntu-24.04/test-cmd/tests/unit/test_charm.py:4:19
  |
4 | from charm import TestCmdCharm
  |                   ^^^^^^^^^^^^
  |

error[unresolved-import]: Cannot resolve imported module `ops`
 --> tests/spread/ubuntu-25.10/charm/platforms/src/charm.py:9:8
  |
9 | import ops
  |        ^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

warning[unused-type-ignore-comment]: Unused blanket `type: ignore` directive
  --> tests/spread/ubuntu-25.10/charm/platforms/src/charm.py:27:31
   |
27 |     ops.main(PlatformsCharm)  # type: ignore
   |                               ^^^^^^^^^^^^^^
   |
help: Remove the unused suppression comment
24 |
25 |
26 | if __name__ == "__main__":  # pragma: nocover
   -     ops.main(PlatformsCharm)  # type: ignore
27 +     ops.main(PlatformsCharm)

error[unresolved-import]: Cannot resolve imported module `ops`
 --> tests/spread/ubuntu-25.10/test-cmd/src/charm.py:6:8
  |
6 | import ops
  |        ^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `pytest_operator.plugin`
 --> tests/spread/ubuntu-25.10/test-cmd/tests/integration/test_charm.py:7:6
  |
7 | from pytest_operator.plugin import OpsTest
  |      ^^^^^^^^^^^^^^^^^^^^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `ops`
 --> tests/spread/ubuntu-25.10/test-cmd/tests/unit/test_charm.py:2:6
  |
2 | from ops import testing
  |      ^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Module `charm` has no member `TestCmdCharm`
 --> tests/spread/ubuntu-25.10/test-cmd/tests/unit/test_charm.py:4:19
  |
4 | from charm import TestCmdCharm
  |                   ^^^^^^^^^^^^
  |

error[unresolved-import]: Cannot resolve imported module `ops`
 --> tests/spread/ubuntu-26.04/charm/platforms/src/charm.py:9:8
  |
9 | import ops
  |        ^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

warning[unused-type-ignore-comment]: Unused blanket `type: ignore` directive
  --> tests/spread/ubuntu-26.04/charm/platforms/src/charm.py:27:31
   |
27 |     ops.main(PlatformsCharm)  # type: ignore
   |                               ^^^^^^^^^^^^^^
   |
help: Remove the unused suppression comment
24 |
25 |
26 | if __name__ == "__main__":  # pragma: nocover
   -     ops.main(PlatformsCharm)  # type: ignore
27 +     ops.main(PlatformsCharm)

error[unresolved-import]: Cannot resolve imported module `ops`
 --> tests/spread/ubuntu-26.04/test-cmd/src/charm.py:6:8
  |
6 | import ops
  |        ^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `pytest_operator.plugin`
 --> tests/spread/ubuntu-26.04/test-cmd/tests/integration/test_charm.py:7:6
  |
7 | from pytest_operator.plugin import OpsTest
  |      ^^^^^^^^^^^^^^^^^^^^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Cannot resolve imported module `ops`
 --> tests/spread/ubuntu-26.04/test-cmd/tests/unit/test_charm.py:2:6
  |
2 | from ops import testing
  |      ^^^
  |
info: Searched in the following paths during module resolution:
info:   1. /home/runner/work/charmcraft/charmcraft (first-party code)
info:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)
info:   3. /snap/astral-ty/1419/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1419/lib64/python3.12/site-packages (site-packages)
info:   5. /home/runner/work/charmcraft/charmcraft/.venv/lib/python3.12/site-packages (site-packages)
info:   6. /home/runner/work/charmcraft/charmcraft/.venv/lib64/python3.12/site-packages (site-packages)
info: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment

error[unresolved-import]: Module `charm` has no member `TestCmdCharm`
 --> tests/spread/ubuntu-26.04/test-cmd/tests/unit/test_charm.py:4:19
  |
4 | from charm import TestCmdCharm
  |                   ^^^^^^^^^^^^
  |

error[invalid-argument-type]: Argument to `Timer.__init__` is incorrect
   --> tests/test_instrum.py:256:32
    |
256 |     with Timer("test message", foo=42):
    |                                ^^^^^^ Expected `dict[str, Any]`, found `Literal[42]`
    |
info: Method defined here
   --> charmcraft/instrum.py:129:9
    |
129 |     def __init__(self, msg: str, **extra_info: dict[str, Any]):
    |         ^^^^^^^^                 ---------------------------- Parameter declared here
    |

error[invalid-argument-type]: Argument to `Timer.__init__` is incorrect
   --> tests/test_instrum.py:274:28
    |
274 |     @Timer("test message", foo=42)
    |                            ^^^^^^ Expected `dict[str, Any]`, found `Literal[42]`
    |
info: Method defined here
   --> charmcraft/instrum.py:129:9
    |
129 |     def __init__(self, msg: str, **extra_info: dict[str, Any]):
    |         ^^^^^^^^                 ---------------------------- Parameter declared here
    |

error[invalid-argument-type]: Argument to `Timer.__init__` is incorrect
   --> tests/test_instrum.py:298:32
    |
298 |     with Timer("test message", foo=42) as timer:
    |                                ^^^^^^ Expected `dict[str, Any]`, found `Literal[42]`
    |
info: Method defined here
   --> charmcraft/instrum.py:129:9
    |
129 |     def __init__(self, msg: str, **extra_info: dict[str, Any]):
    |         ^^^^^^^^                 ---------------------------- Parameter declared here
    |

error[invalid-assignment]: Object of type `Mock` is not assignable to attribute `write` of type `def write(self, library: Library) -> None`
  --> tests/unit/commands/test_lifecycle.py:91:5
   |
91 |     libs_service.write = mock.Mock(wraps=libs_service.write)
   |     ^^^^^^^^^^^^^^^^^^
   |
info: Implicit shadowing of function `write`. Add an annotation to make it explicit if this is intentional

error[unresolved-attribute]: Object of type `bound method CharmLibsService.write(library: Library) -> None` has no attribute `assert_called_once_with`
  --> tests/unit/commands/test_lifecycle.py:95:5
   |
95 |     libs_service.write.assert_called_once_with(store_lib)
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |

error[not-subscriptable]: Cannot subscript object of type `None` with no `__getitem__` method
  --> tests/unit/models/test_config.py:75:23
   |
75 |     assert isinstance(config.options["my-opt"], type_)
   |                       ^^^^^^^^^^^^^^^^^^^^^^^^
   |

error[invalid-assignment]: Object of type `() -> Literal["/python -m pip"]` is not assignable to attribute `_get_pip` of type `def _get_pip(self) -> str`
  --> tests/unit/parts/plugins/test_poetry.py:40:5
   |
40 |     poetry_plugin._get_pip = lambda: "/python -m pip"
   |     ^^^^^^^^^^^^^^^^^^^^^^
   |
info: Implicit shadowing of function `_get_pip`. Add an annotation to make it explicit if this is intentional

error[invalid-assignment]: Object of type `() -> Literal["/python -m pip"]` is not assignable to attribute `_get_pip` of type `def _get_pip(self) -> str`
  --> tests/unit/parts/plugins/test_python.py:62:5
   |
62 |     python_plugin._get_pip = lambda: "/python -m pip"
   |     ^^^^^^^^^^^^^^^^^^^^^^
   |
info: Implicit shadowing of function `_get_pip`. Add an annotation to make it explicit if this is intentional

error[invalid-argument-type]: Argument to `AnalysisService.__init__` is incorrect
   --> tests/unit/services/test_analysis.py:112:67
    |
112 |     return analysis.AnalysisService(app=application.APP_METADATA, services=None)
    |                                                                   ^^^^^^^^^^^^^ Expected `ServiceFactory`, found `None`
    |
info: Method defined here
  --> charmcraft/services/analysis.py:37:9
   |
37 |     def __init__(  # (too many arguments)
   |         ^^^^^^^^
38 |         self,
39 |         app: craft_application.AppMetadata,
40 |         services: craft_application.ServiceFactory,
   |         ------------------------------------------ Parameter declared here
   |

error[invalid-argument-type]: Argument is incorrect
  --> tests/unit/services/test_lifecycle.py:55:17
   |
55 |                 build_for=plan_build_for,  # pyright: ignore[reportArgumentType]
   |                 ^^^^^^^^^^^^^^^^^^^^^^^^ Expected `DebianArchitecture | Literal["all"]`, found `str`
   |

error[invalid-argument-type]: Argument is incorrect
  --> tests/unit/services/test_lifecycle.py:94:17
   |
94 |                 build_for=f"{HOST_ARCH}-foreign",  # pyright: ignore[reportArgumentType]
   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Expected `DebianArchitecture | Literal["all"]`, found `str`
   |

error[invalid-argument-type]: Argument to `ProjectService.__init__` is incorrect
  --> tests/unit/services/test_project.py:34:45
   |
34 |     return ProjectService(app=APP_METADATA, services=None, project_dir=project_path)
   |                                             ^^^^^^^^^^^^^ Expected `ServiceFactory`, found `None`
   |
info: Method defined here
  --> .venv/lib/python3.12/site-packages/craft_application/services/project.py:57:9
   |
57 |     def __init__(
   |         ^^^^^^^^
58 |         self, app: AppMetadata, services: ServiceFactory, *, project_dir: pathlib.Path
   |                                 ------------------------ Parameter declared here
   |

error[invalid-argument-type]: Argument to `ProviderService.__init__` is incorrect
   --> tests/unit/services/test_provider.py:123:9
    |
123 |         services=None,  # pyright: ignore[reportArgumentType]
    |         ^^^^^^^^^^^^^ Expected `ServiceFactory`, found `None`
    |
info: Method defined here
  --> charmcraft/services/provider.py:43:9
   |
43 |     def __init__(
   |         ^^^^^^^^
44 |         self,
45 |         app: craft_application.AppMetadata,
46 |         services: craft_application.ServiceFactory,
   |         ------------------------------------------ Parameter declared here
   |

error[invalid-argument-type]: Argument to `AppService.__init__` is incorrect
  --> tests/unit/services/test_store.py:50:56
   |
50 |     store = StoreService(app=application.APP_METADATA, services=None)
   |                                                        ^^^^^^^^^^^^^ Expected `ServiceFactory`, found `None`
   |
info: Method defined here
  --> .venv/lib/python3.12/site-packages/craft_application/services/base.py:44:9
   |
44 |     def __init__(self, app: AppMetadata, services: ServiceFactory) -> None:
   |         ^^^^^^^^                         ------------------------ Parameter declared here
   |

error[unresolved-attribute]: Attribute `group` is not defined on `None` in union `Match[str] | None`
  --> tests/unit/test_linters.py:43:12
   |
43 |     assert linters.PYTHON_NAME_REGEX.match(name).group(0) == name
   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |

error[unresolved-attribute]: Attribute `group` is not defined on `None` in union `Match[str] | None`
  --> tests/unit/test_linters.py:44:12
   |
44 |     assert linters.PYTHON_NAME_REGEX.match(f"{name}{next_char}").group(0) == name
   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |

error[unresolved-attribute]: Attribute `group` is not defined on `None` in union `Match[str] | None`
  --> tests/unit/test_linters.py:46:9
   |
46 |         linters.PYTHON_NAME_REGEX.match(f"{name}{next_char}{further_garbage}").group(0)
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |

error[unresolved-attribute]: Attribute `group` is not defined on `None` in union `Match[str] | None`
  --> tests/unit/test_linters.py:62:12
   |
62 |     assert linters.MIN_VERSION_REGEX.search(string).group(1) == expected
   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |

error[unresolved-attribute]: Attribute `group` is not defined on `None` in union `Match[str] | None`
  --> tests/unit/test_linters.py:76:24
   |
76 |     assert expected in linters.APPROX_VERSION_REGEX.search(string).group(1, 2)
   |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |

error[unresolved-attribute]: Attribute `group` is not defined on `None` in union `Match[str] | None`
  --> tests/unit/test_linters.py:84:12
   |
84 |     assert linters.EXACT_VERSION_REGEX.search(string).group(1) == expected
   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |

error[no-matching-overload]: No overload of function `format_content` matches arguments
   --> tests/unit/utils/test_cli.py:285:9
    |
285 |         format_content(None, fmt)
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^
    |
info: First overload defined here
   --> charmcraft/utils/cli.py:185:5
    |
185 |   def format_content(
    |  _____^
186 | |     content: dict[str, Any] | list[dict[str, Any]], fmt: OutputFormat | str | None
187 | | ) -> str: ...
    | |________^
    |
info: Possible overloads for function `format_content`:
info:   (content: dict[str, Any] | list[dict[str, Any]], fmt: OutputFormat | str | None) -> str
info:   (content: str | Real | list[Unknown] | dict[Unknown, Unknown], fmt: OutputFormat | str | None) -> str
info: Overload implementation defined here
   --> charmcraft/utils/cli.py:196:5
    |
196 | def format_content(content, fmt=None):
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |

Found 146 diagnostics

@lengau
Copy link
Copy Markdown
Collaborator Author

lengau commented Apr 22, 2026

@copilot Please use the instructions and skills from #2663 and create a fix for the bug reproduced by the failing test in this PR.

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 22, 2026

@copilot Please use the instructions and skills from #2663 and create a fix for the bug reproduced by the failing test in this PR.

Fixed in commit be54a55. The build() function in _reactive.py now copies .build.manifest from build_dir/ to install_dir/ after charm build completes, using shutil.copy2. The previously failing test_build_includes_build_manifest test now passes along with all 22 other existing tests.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

charm artifacts from reactive plugin are missing valuable build metadata

3 participants