Skip to content

tests: add reproducer for fetch-lib unhelpful error message (#2204)#2666

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

tests: add reproducer for fetch-lib unhelpful error message (#2204)#2666
lengau wants to merge 3 commits intomainfrom
test/reproducer-issue-2204

Conversation

@lengau
Copy link
Copy Markdown
Collaborator

@lengau lengau commented Apr 22, 2026

Summary

Adds a failing unit test that reproduces #2204: charmcraft fetch-lib prints the unhelpful message Library None not found in Charmhub. when a library's lib_id is not registered in Charmhub.

Bug

When fetching all libs (no argument), parsed_args.library is None. When the Charmhub bulk API returns no entry for a local/unpublished library's lib_id, the error uses parsed_args.library directly, producing "Library None not found in Charmhub." instead of a meaningful identifier.

Reproducer

uv run python -m pytest tests/unit/commands/test_store.py::test_fetch_lib_command_unregistered_lib_id_error_message -v

The test fails with:

AssertionError: Bug reproduced: error message uses 'None' instead of library name:
'Library None not found in Charmhub.'

Closes #2204

bepri and others added 2 commits April 21, 2026 17:51
Add a failing test that demonstrates that 'charmcraft fetch-lib'
produces the unhelpful error 'Library None not found in Charmhub.'
when a library's lib_id is not registered in Charmhub (e.g. a local
or unpublished library).

The error message uses parsed_args.library (None when running without
arguments) rather than including the actual library name or identifier.

Closes #2204

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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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/1423/lib/python3.12/site-packages (site-packages)
info:   4. /snap/astral-ty/1423/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 4a4d0d4. In FetchLibCommand.run(), both error-raise sites now use parsed_args.library or lib_data.full_name (per-library loop) and parsed_args.library or local_libs_data[0].full_name (bulk API error), so when no library argument is passed the message correctly identifies the library by its full name (e.g. "Library charms.testcharm.v0.testlib not found in Charmhub.") instead of "Library None not found in Charmhub.".

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.

[3.4.3] Charmcraft fetch-lib fails with Library None not found in Charmhub.

3 participants