craft-application 2.1.0__tar.gz → 2.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. {craft-application-2.1.0 → craft-application-2.2.0}/PKG-INFO +2 -2
  2. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/__init__.py +1 -1
  3. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/_version.py +2 -2
  4. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/application.py +27 -2
  5. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application.egg-info/PKG-INFO +2 -2
  6. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application.egg-info/requires.txt +1 -1
  7. {craft-application-2.1.0 → craft-application-2.2.0}/pyproject.toml +1 -1
  8. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/test_application.py +29 -0
  9. {craft-application-2.1.0 → craft-application-2.2.0}/.editorconfig +0 -0
  10. {craft-application-2.1.0 → craft-application-2.2.0}/.github/.jira_sync_config.yaml +0 -0
  11. {craft-application-2.1.0 → craft-application-2.2.0}/.github/ISSUE_TEMPLATE/bug.yaml +0 -0
  12. {craft-application-2.1.0 → craft-application-2.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  13. {craft-application-2.1.0 → craft-application-2.2.0}/.github/ISSUE_TEMPLATE/task.yaml +0 -0
  14. {craft-application-2.1.0 → craft-application-2.2.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  15. {craft-application-2.1.0 → craft-application-2.2.0}/.github/release-drafter.yaml +0 -0
  16. {craft-application-2.1.0 → craft-application-2.2.0}/.github/release-drafter.yml +0 -0
  17. {craft-application-2.1.0 → craft-application-2.2.0}/.github/renovate.json5 +0 -0
  18. {craft-application-2.1.0 → craft-application-2.2.0}/.github/workflows/cla-check.yaml +0 -0
  19. {craft-application-2.1.0 → craft-application-2.2.0}/.github/workflows/docs.yaml +0 -0
  20. {craft-application-2.1.0 → craft-application-2.2.0}/.github/workflows/release-drafter.yaml +0 -0
  21. {craft-application-2.1.0 → craft-application-2.2.0}/.github/workflows/tests.yaml +0 -0
  22. {craft-application-2.1.0 → craft-application-2.2.0}/.gitignore +0 -0
  23. {craft-application-2.1.0 → craft-application-2.2.0}/.pre-commit-config.yaml +0 -0
  24. {craft-application-2.1.0 → craft-application-2.2.0}/.readthedocs.yaml +0 -0
  25. {craft-application-2.1.0 → craft-application-2.2.0}/.yamllint.yaml +0 -0
  26. {craft-application-2.1.0 → craft-application-2.2.0}/HACKING.rst +0 -0
  27. {craft-application-2.1.0 → craft-application-2.2.0}/LICENSE +0 -0
  28. {craft-application-2.1.0 → craft-application-2.2.0}/README.rst +0 -0
  29. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/commands/__init__.py +0 -0
  30. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/commands/base.py +0 -0
  31. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/commands/lifecycle.py +0 -0
  32. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/commands/other.py +0 -0
  33. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/errors.py +0 -0
  34. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/grammar.py +0 -0
  35. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/launchpad/__init__.py +0 -0
  36. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/launchpad/errors.py +0 -0
  37. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/launchpad/launchpad.py +0 -0
  38. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/launchpad/models/__init__.py +0 -0
  39. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/launchpad/models/base.py +0 -0
  40. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/launchpad/models/build.py +0 -0
  41. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/launchpad/models/code.py +0 -0
  42. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/launchpad/models/distro.py +0 -0
  43. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/launchpad/models/project.py +0 -0
  44. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/launchpad/models/recipe.py +0 -0
  45. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/launchpad/util.py +0 -0
  46. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/misc/instance_bashrc +0 -0
  47. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/models/__init__.py +0 -0
  48. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/models/base.py +0 -0
  49. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/models/constraints.py +0 -0
  50. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/models/grammar.py +0 -0
  51. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/models/metadata.py +0 -0
  52. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/models/project.py +0 -0
  53. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/py.typed +0 -0
  54. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/remote/__init__.py +0 -0
  55. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/remote/errors.py +0 -0
  56. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/remote/git.py +0 -0
  57. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/remote/utils.py +0 -0
  58. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/remote/worktree.py +0 -0
  59. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/secrets.py +0 -0
  60. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/services/__init__.py +0 -0
  61. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/services/base.py +0 -0
  62. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/services/lifecycle.py +0 -0
  63. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/services/package.py +0 -0
  64. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/services/provider.py +0 -0
  65. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/services/remotebuild.py +0 -0
  66. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/services/request.py +0 -0
  67. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/services/service_factory.py +0 -0
  68. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/util/__init__.py +0 -0
  69. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/util/callbacks.py +0 -0
  70. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/util/error_formatting.py +0 -0
  71. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/util/logging.py +0 -0
  72. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/util/paths.py +0 -0
  73. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/util/platforms.py +0 -0
  74. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/util/repositories.py +0 -0
  75. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/util/snap_config.py +0 -0
  76. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/util/string.py +0 -0
  77. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application/util/yaml.py +0 -0
  78. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application.egg-info/SOURCES.txt +0 -0
  79. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application.egg-info/dependency_links.txt +0 -0
  80. {craft-application-2.1.0 → craft-application-2.2.0}/craft_application.egg-info/top_level.txt +0 -0
  81. {craft-application-2.1.0 → craft-application-2.2.0}/docs/_static/css/custom.css +0 -0
  82. {craft-application-2.1.0 → craft-application-2.2.0}/docs/conf.py +0 -0
  83. {craft-application-2.1.0 → craft-application-2.2.0}/docs/explanation/index.rst +0 -0
  84. {craft-application-2.1.0 → craft-application-2.2.0}/docs/howto/index.rst +0 -0
  85. {craft-application-2.1.0 → craft-application-2.2.0}/docs/index.rst +0 -0
  86. {craft-application-2.1.0 → craft-application-2.2.0}/docs/reference/index.rst +0 -0
  87. {craft-application-2.1.0 → craft-application-2.2.0}/docs/tutorials/index.rst +0 -0
  88. {craft-application-2.1.0 → craft-application-2.2.0}/setup.cfg +0 -0
  89. {craft-application-2.1.0 → craft-application-2.2.0}/tests/__init__.py +0 -0
  90. {craft-application-2.1.0 → craft-application-2.2.0}/tests/conftest.py +0 -0
  91. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/__init__.py +0 -0
  92. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/conftest.py +0 -0
  93. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/data/build-secrets/secret-source-folder/source-file.txt +0 -0
  94. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/data/build-secrets/testcraft.yaml +0 -0
  95. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/data/invalid_projects/build-error/testcraft.yaml +0 -0
  96. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/data/valid_projects/adoption/stderr +0 -0
  97. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/data/valid_projects/adoption/testcraft.yaml +0 -0
  98. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/data/valid_projects/basic/stderr +0 -0
  99. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/data/valid_projects/basic/testcraft.yaml +0 -0
  100. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/data/valid_projects/environment/stderr +0 -0
  101. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/data/valid_projects/environment/testcraft.yaml +0 -0
  102. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/data/valid_projects/grammar/src/on-amd64-to-amd64/hello.txt +0 -0
  103. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/data/valid_projects/grammar/src/on-amd64-to-arm64/hello.txt +0 -0
  104. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/data/valid_projects/grammar/stderr +0 -0
  105. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/data/valid_projects/grammar/testcraft.yaml +0 -0
  106. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/launchpad/__init__.py +0 -0
  107. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/launchpad/conftest.py +0 -0
  108. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/launchpad/test_anonymous_access.py +0 -0
  109. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/services/__init__.py +0 -0
  110. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/services/test_lifecycle.py +0 -0
  111. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/services/test_provider.py +0 -0
  112. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/services/test_request.py +0 -0
  113. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/services/test_service_factory.py +0 -0
  114. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/test_application.py +0 -0
  115. {craft-application-2.1.0 → craft-application-2.2.0}/tests/integration/test_version.py +0 -0
  116. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/__init__.py +0 -0
  117. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/commands/__init__.py +0 -0
  118. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/commands/test_base.py +0 -0
  119. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/commands/test_lifecycle.py +0 -0
  120. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/commands/test_other.py +0 -0
  121. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/conftest.py +0 -0
  122. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/launchpad/__init__.py +0 -0
  123. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/launchpad/conftest.py +0 -0
  124. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/launchpad/models/__init__.py +0 -0
  125. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/launchpad/models/test_base.py +0 -0
  126. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/launchpad/models/test_code.py +0 -0
  127. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/launchpad/test_launchpad.py +0 -0
  128. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/launchpad/test_util.py +0 -0
  129. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/models/__init__.py +0 -0
  130. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/models/project_models/basic_project.yaml +0 -0
  131. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/models/project_models/full_project.yaml +0 -0
  132. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/models/project_models/invalid_project.yaml +0 -0
  133. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/models/test_constraints.py +0 -0
  134. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/models/test_project.py +0 -0
  135. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/remote/__init__.py +0 -0
  136. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/remote/conftest.py +0 -0
  137. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/remote/test_errors.py +0 -0
  138. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/remote/test_git.py +0 -0
  139. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/remote/test_utils.py +0 -0
  140. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/remote/test_worktree.py +0 -0
  141. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/services/__init__.py +0 -0
  142. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/services/conftest.py +0 -0
  143. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/services/test_lifecycle.py +0 -0
  144. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/services/test_package.py +0 -0
  145. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/services/test_provider.py +0 -0
  146. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/services/test_remotebuild.py +0 -0
  147. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/services/test_repositories.py +0 -0
  148. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/services/test_request.py +0 -0
  149. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/services/test_service_factory.py +0 -0
  150. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/test_errors.py +0 -0
  151. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/test_grammar.py +0 -0
  152. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/test_nothing.py +0 -0
  153. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/test_secrets.py +0 -0
  154. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/util/__init__.py +0 -0
  155. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/util/invalid_yaml/_README +0 -0
  156. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/util/invalid_yaml/duplicate_second_level.yaml-invalid +0 -0
  157. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/util/invalid_yaml/duplicate_top_level.yaml-invalid +0 -0
  158. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/util/invalid_yaml/unhashable.yaml-invalid +0 -0
  159. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/util/test_error_formatting.py +0 -0
  160. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/util/test_logging.py +0 -0
  161. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/util/test_paths.py +0 -0
  162. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/util/test_snap_config.py +0 -0
  163. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/util/test_string.py +0 -0
  164. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/util/test_yaml.py +0 -0
  165. {craft-application-2.1.0 → craft-application-2.2.0}/tests/unit/util/valid_yaml/empty.yaml +0 -0
  166. {craft-application-2.1.0 → craft-application-2.2.0}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: craft-application
3
- Version: 2.1.0
3
+ Version: 2.2.0
4
4
  Summary: A framework for *craft applications.
5
5
  Classifier: Development Status :: 5 - Production/Stable
6
6
  Classifier: Environment :: Console
@@ -35,7 +35,7 @@ Requires-Dist: hypothesis>=6.0; extra == "dev"
35
35
  Requires-Dist: pyfakefs~=5.3; extra == "dev"
36
36
  Requires-Dist: pytest==8.1.1; extra == "dev"
37
37
  Requires-Dist: pytest-check==2.3.1; extra == "dev"
38
- Requires-Dist: pytest-cov==4.1.0; extra == "dev"
38
+ Requires-Dist: pytest-cov==5.0.0; extra == "dev"
39
39
  Requires-Dist: pytest-mock==3.12.0; extra == "dev"
40
40
  Requires-Dist: pytest-rerunfailures==13.0; extra == "dev"
41
41
  Requires-Dist: pytest-time>=0.3.1; extra == "dev"
@@ -32,7 +32,7 @@ except ImportError: # pragma: no cover
32
32
  from importlib.metadata import version, PackageNotFoundError
33
33
 
34
34
  try:
35
- __version__ = version("craft-archives")
35
+ __version__ = version("craft-application")
36
36
  except PackageNotFoundError:
37
37
  __version__ = "dev"
38
38
 
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '2.1.0'
16
- __version_tuple__ = version_tuple = (2, 1, 0)
15
+ __version__ = version = '2.2.0'
16
+ __version_tuple__ = version_tuple = (2, 2, 0)
@@ -323,7 +323,10 @@ class Application:
323
323
  if build_for and build_for != build_info.build_for:
324
324
  continue
325
325
 
326
- env = {"CRAFT_PLATFORM": build_info.platform}
326
+ env = {
327
+ "CRAFT_PLATFORM": build_info.platform,
328
+ "CRAFT_VERBOSITY_LEVEL": craft_cli.emit.get_mode().name,
329
+ }
327
330
 
328
331
  if self.app.features.build_secrets:
329
332
  # If using build secrets, put them in the environment of the managed
@@ -658,16 +661,38 @@ class Application:
658
661
  # Set the logging level to DEBUG for all craft-libraries. This is OK even if
659
662
  # the specific application doesn't use a specific library, the call does not
660
663
  # import the package.
664
+ emitter_mode: craft_cli.EmitterMode = craft_cli.EmitterMode.BRIEF
665
+ invalid_emitter_level = False
661
666
  util.setup_loggers(*self._cli_loggers)
662
667
 
668
+ # environment variable takes precedence over the default
669
+ emitter_verbosity_level_env = os.environ.get("CRAFT_VERBOSITY_LEVEL", None)
670
+
671
+ if emitter_verbosity_level_env:
672
+ try:
673
+ emitter_mode = craft_cli.EmitterMode[
674
+ emitter_verbosity_level_env.strip().upper()
675
+ ]
676
+ except KeyError:
677
+ invalid_emitter_level = True
678
+
663
679
  craft_cli.emit.init(
664
- mode=craft_cli.EmitterMode.BRIEF,
680
+ mode=emitter_mode,
665
681
  appname=self.app.name,
666
682
  greeting=f"Starting {self.app.name}, version {self.app.version}",
667
683
  log_filepath=self.log_path,
668
684
  streaming_brief=True,
669
685
  )
670
686
 
687
+ craft_cli.emit.debug(f"Log verbosity level set to {emitter_mode.name}")
688
+
689
+ if invalid_emitter_level:
690
+ craft_cli.emit.progress(
691
+ f"Invalid verbosity level '{emitter_verbosity_level_env}', using default 'BRIEF'.\n"
692
+ f"Valid levels are: {', '.join(emitter.name for emitter in craft_cli.EmitterMode)}",
693
+ permanent=True,
694
+ )
695
+
671
696
 
672
697
  def filter_plan(
673
698
  build_plan: list[BuildInfo],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: craft-application
3
- Version: 2.1.0
3
+ Version: 2.2.0
4
4
  Summary: A framework for *craft applications.
5
5
  Classifier: Development Status :: 5 - Production/Stable
6
6
  Classifier: Environment :: Console
@@ -35,7 +35,7 @@ Requires-Dist: hypothesis>=6.0; extra == "dev"
35
35
  Requires-Dist: pyfakefs~=5.3; extra == "dev"
36
36
  Requires-Dist: pytest==8.1.1; extra == "dev"
37
37
  Requires-Dist: pytest-check==2.3.1; extra == "dev"
38
- Requires-Dist: pytest-cov==4.1.0; extra == "dev"
38
+ Requires-Dist: pytest-cov==5.0.0; extra == "dev"
39
39
  Requires-Dist: pytest-mock==3.12.0; extra == "dev"
40
40
  Requires-Dist: pytest-rerunfailures==13.0; extra == "dev"
41
41
  Requires-Dist: pytest-time>=0.3.1; extra == "dev"
@@ -22,7 +22,7 @@ hypothesis>=6.0
22
22
  pyfakefs~=5.3
23
23
  pytest==8.1.1
24
24
  pytest-check==2.3.1
25
- pytest-cov==4.1.0
25
+ pytest-cov==5.0.0
26
26
  pytest-mock==3.12.0
27
27
  pytest-rerunfailures==13.0
28
28
  pytest-time>=0.3.1
@@ -50,7 +50,7 @@ dev = [
50
50
  "pyfakefs~=5.3",
51
51
  "pytest==8.1.1",
52
52
  "pytest-check==2.3.1",
53
- "pytest-cov==4.1.0",
53
+ "pytest-cov==5.0.0",
54
54
  "pytest-mock==3.12.0",
55
55
  "pytest-rerunfailures==13.0",
56
56
  "pytest-time>=0.3.1",
@@ -450,6 +450,35 @@ def test_show_app_name_and_version(monkeypatch, capsys, app):
450
450
  assert f"Starting testcraft, version {app.app.version}" in err
451
451
 
452
452
 
453
+ @pytest.mark.parametrize("verbosity", list(craft_cli.EmitterMode))
454
+ def test_set_verbosity_from_env(monkeypatch, capsys, app, verbosity):
455
+ """Test that the emitter verbosity is set from the environment."""
456
+ monkeypatch.setattr(sys, "argv", ["testcraft"])
457
+ monkeypatch.setenv("CRAFT_VERBOSITY_LEVEL", verbosity.name)
458
+
459
+ with pytest.raises(SystemExit):
460
+ app.run()
461
+
462
+ _, err = capsys.readouterr()
463
+ assert "testcraft [help]" in err
464
+ assert craft_cli.emit._mode == verbosity
465
+
466
+
467
+ def test_set_verbosity_from_env_incorrect(monkeypatch, capsys, app):
468
+ """Test that the emitter verbosity is using the default level when invalid."""
469
+ monkeypatch.setattr(sys, "argv", ["testcraft"])
470
+ monkeypatch.setenv("CRAFT_VERBOSITY_LEVEL", "incorrect")
471
+
472
+ with pytest.raises(SystemExit):
473
+ app.run()
474
+
475
+ _, err = capsys.readouterr()
476
+ assert "testcraft [help]" in err
477
+ assert "Invalid verbosity level 'incorrect'" in err
478
+ assert "Valid levels are: QUIET, BRIEF, VERBOSE, DEBUG, TRACE" in err
479
+ assert craft_cli.emit._mode == craft_cli.EmitterMode.BRIEF
480
+
481
+
453
482
  def test_pre_run_project_dir_managed(app):
454
483
  app.is_managed = lambda: True
455
484
  dispatcher = mock.Mock(spec_set=craft_cli.Dispatcher)