avr-cli 0.3.0__tar.gz → 0.4.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 (96) hide show
  1. {avr_cli-0.3.0 → avr_cli-0.4.0}/PKG-INFO +3 -2
  2. {avr_cli-0.3.0 → avr_cli-0.4.0}/avr_cli.egg-info/PKG-INFO +3 -2
  3. {avr_cli-0.3.0 → avr_cli-0.4.0}/avr_cli.egg-info/SOURCES.txt +2 -0
  4. {avr_cli-0.3.0 → avr_cli-0.4.0}/avr_cli.egg-info/requires.txt +2 -1
  5. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/_build_info.py +1 -1
  6. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/api_client.py +21 -3
  7. avr_cli-0.4.0/avrea_cli/commands/sbom.py +757 -0
  8. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/helpers.py +15 -1
  9. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/json_output.py +20 -5
  10. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/main.py +1 -0
  11. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/vm.py +21 -3
  12. {avr_cli-0.3.0 → avr_cli-0.4.0}/pyproject.toml +5 -3
  13. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_api_client.py +43 -0
  14. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_helpers.py +26 -0
  15. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_json_output.py +30 -0
  16. avr_cli-0.4.0/tests/test_sbom.py +903 -0
  17. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_vm.py +39 -4
  18. {avr_cli-0.3.0 → avr_cli-0.4.0}/LICENSE +0 -0
  19. {avr_cli-0.3.0 → avr_cli-0.4.0}/README.md +0 -0
  20. {avr_cli-0.3.0 → avr_cli-0.4.0}/avr_cli.egg-info/dependency_links.txt +0 -0
  21. {avr_cli-0.3.0 → avr_cli-0.4.0}/avr_cli.egg-info/entry_points.txt +0 -0
  22. {avr_cli-0.3.0 → avr_cli-0.4.0}/avr_cli.egg-info/top_level.txt +0 -0
  23. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/__init__.py +0 -0
  24. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/assets/logo_mark.svg +0 -0
  25. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/audit.py +0 -0
  26. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/auth.py +0 -0
  27. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/billing.py +0 -0
  28. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/click_ext.py +0 -0
  29. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/commands/__init__.py +0 -0
  30. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/commands/auth_cmd.py +0 -0
  31. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/commands/cache.py +0 -0
  32. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/commands/config_cmd.py +0 -0
  33. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/commands/health.py +0 -0
  34. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/commands/internal.py +0 -0
  35. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/commands/job.py +0 -0
  36. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/commands/log.py +0 -0
  37. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/commands/org.py +0 -0
  38. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/commands/pr.py +0 -0
  39. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/commands/repo.py +0 -0
  40. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/commands/run.py +0 -0
  41. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/commands/settings.py +0 -0
  42. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/commands/status.py +0 -0
  43. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/commands/workflow.py +0 -0
  44. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/config.py +0 -0
  45. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/display.py +0 -0
  46. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/docs_gen.py +0 -0
  47. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/firewall.py +0 -0
  48. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/log_display.py +0 -0
  49. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/metrics_display.py +0 -0
  50. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/output.py +0 -0
  51. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/paths.py +0 -0
  52. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/repo_context.py +0 -0
  53. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/run_diagnostics.py +0 -0
  54. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/run_diagnostics_display.py +0 -0
  55. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/run_refs.py +0 -0
  56. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/transport.py +0 -0
  57. {avr_cli-0.3.0 → avr_cli-0.4.0}/avrea_cli/version.py +0 -0
  58. {avr_cli-0.3.0 → avr_cli-0.4.0}/setup.cfg +0 -0
  59. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_auth.py +0 -0
  60. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_auth_login.py +0 -0
  61. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_auth_sso.py +0 -0
  62. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_cache.py +0 -0
  63. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_config.py +0 -0
  64. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_config_cmd.py +0 -0
  65. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_display.py +0 -0
  66. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_docs_gen.py +0 -0
  67. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_env_conventions.py +0 -0
  68. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_firewall.py +0 -0
  69. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_global_flags.py +0 -0
  70. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_job_list.py +0 -0
  71. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_job_metrics_cmd.py +0 -0
  72. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_job_view_logs.py +0 -0
  73. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_lazy_registry.py +0 -0
  74. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_log_display.py +0 -0
  75. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_metrics_display.py +0 -0
  76. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_org_email_domain.py +0 -0
  77. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_org_saml.py +0 -0
  78. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_output.py +0 -0
  79. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_piped_output.py +0 -0
  80. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_pr_list.py +0 -0
  81. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_public_mirrors.py +0 -0
  82. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_repo_context.py +0 -0
  83. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_repo_mirror.py +0 -0
  84. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_run_attempts.py +0 -0
  85. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_run_command_refs.py +0 -0
  86. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_run_diagnose.py +0 -0
  87. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_run_list_flags.py +0 -0
  88. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_run_logs.py +0 -0
  89. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_run_refs.py +0 -0
  90. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_run_view.py +0 -0
  91. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_settings.py +0 -0
  92. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_transport.py +0 -0
  93. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_web_flag.py +0 -0
  94. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_workflow_actions.py +0 -0
  95. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_workflow_run.py +0 -0
  96. {avr_cli-0.3.0 → avr_cli-0.4.0}/tests/test_workflow_view.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: avr-cli
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: Avrea command-line client
5
5
  Author-email: Avrea <support@avrea.com>
6
6
  License-Expression: Apache-2.0
@@ -14,6 +14,7 @@ Classifier: Programming Language :: Python :: 3.14
14
14
  Requires-Python: >=3.14
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
+ Requires-Dist: anyio>=4.14.2
17
18
  Requires-Dist: click>=8.3.1
18
19
  Requires-Dist: httpx>=0.28.1
19
20
  Requires-Dist: platformdirs>=4.0
@@ -25,7 +26,7 @@ Provides-Extra: dev
25
26
  Requires-Dist: pytest>=9.0.3; extra == "dev"
26
27
  Requires-Dist: pytest-asyncio>=1.3.0; extra == "dev"
27
28
  Requires-Dist: pytest-timeout>=2.4.0; extra == "dev"
28
- Requires-Dist: ruff; extra == "dev"
29
+ Requires-Dist: ruff==0.15.13; extra == "dev"
29
30
  Requires-Dist: ty==0.0.15; extra == "dev"
30
31
  Dynamic: license-file
31
32
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: avr-cli
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: Avrea command-line client
5
5
  Author-email: Avrea <support@avrea.com>
6
6
  License-Expression: Apache-2.0
@@ -14,6 +14,7 @@ Classifier: Programming Language :: Python :: 3.14
14
14
  Requires-Python: >=3.14
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
+ Requires-Dist: anyio>=4.14.2
17
18
  Requires-Dist: click>=8.3.1
18
19
  Requires-Dist: httpx>=0.28.1
19
20
  Requires-Dist: platformdirs>=4.0
@@ -25,7 +26,7 @@ Provides-Extra: dev
25
26
  Requires-Dist: pytest>=9.0.3; extra == "dev"
26
27
  Requires-Dist: pytest-asyncio>=1.3.0; extra == "dev"
27
28
  Requires-Dist: pytest-timeout>=2.4.0; extra == "dev"
28
- Requires-Dist: ruff; extra == "dev"
29
+ Requires-Dist: ruff==0.15.13; extra == "dev"
29
30
  Requires-Dist: ty==0.0.15; extra == "dev"
30
31
  Dynamic: license-file
31
32
 
@@ -45,6 +45,7 @@ avrea_cli/commands/org.py
45
45
  avrea_cli/commands/pr.py
46
46
  avrea_cli/commands/repo.py
47
47
  avrea_cli/commands/run.py
48
+ avrea_cli/commands/sbom.py
48
49
  avrea_cli/commands/settings.py
49
50
  avrea_cli/commands/status.py
50
51
  avrea_cli/commands/workflow.py
@@ -83,6 +84,7 @@ tests/test_run_list_flags.py
83
84
  tests/test_run_logs.py
84
85
  tests/test_run_refs.py
85
86
  tests/test_run_view.py
87
+ tests/test_sbom.py
86
88
  tests/test_settings.py
87
89
  tests/test_transport.py
88
90
  tests/test_vm.py
@@ -1,3 +1,4 @@
1
+ anyio>=4.14.2
1
2
  click>=8.3.1
2
3
  httpx>=0.28.1
3
4
  platformdirs>=4.0
@@ -10,5 +11,5 @@ idna>=3.15
10
11
  pytest>=9.0.3
11
12
  pytest-asyncio>=1.3.0
12
13
  pytest-timeout>=2.4.0
13
- ruff
14
+ ruff==0.15.13
14
15
  ty==0.0.15
@@ -1,2 +1,2 @@
1
1
  # Auto-generated by .github/workflows/release.yml; do not edit.
2
- GIT_COMMIT = "98e501799b97fcf00fda142d41d8dce6befa8a3e"
2
+ GIT_COMMIT = "5d74471e85fe9ce7a40209ef3daebaad435c38d8"
@@ -34,11 +34,17 @@ class ApiClient:
34
34
  styled_status = click.style(status, fg="red")
35
35
  click.echo(f" → {styled_method} {url} [{styled_status}]", err=True)
36
36
 
37
- def public_get(self, path: str, params: dict[str, Any] | None = None) -> dict[str, Any]:
38
- """GET request to public API."""
37
+ def public_get(
38
+ self, path: str, params: dict[str, Any] | None = None, timeout: float | None = None
39
+ ) -> dict[str, Any]:
40
+ """GET request to public API. ``timeout`` overrides the client default for
41
+ this call, e.g. so a polling loop never outlives its own deadline."""
39
42
  url = f"{self.config.public_api_url}{path}"
43
+ effective_timeout = timeout if timeout is not None else self.timeout
40
44
  try:
41
- response = self._http.get(url, headers=self.config.get_api_headers(), timeout=self.timeout, params=params)
45
+ response = self._http.get(
46
+ url, headers=self.config.get_api_headers(), timeout=effective_timeout, params=params
47
+ )
42
48
  except httpx.HTTPError as exc:
43
49
  self._log("GET", url, type(exc).__name__)
44
50
  raise
@@ -58,6 +64,18 @@ class ApiClient:
58
64
  response.raise_for_status()
59
65
  return response.text
60
66
 
67
+ def public_get_bytes(self, path: str, params: dict[str, Any] | None = None) -> bytes:
68
+ """GET a binary or opaque public API response, such as an SBOM artifact."""
69
+ url = f"{self.config.public_api_url}{path}"
70
+ try:
71
+ response = self._http.get(url, headers=self.config.get_api_headers(), timeout=self.timeout, params=params)
72
+ except httpx.HTTPError as exc:
73
+ self._log("GET", url, type(exc).__name__)
74
+ raise
75
+ self._log("GET", str(response.request.url), response.status_code)
76
+ response.raise_for_status()
77
+ return response.content
78
+
61
79
  def public_post(
62
80
  self,
63
81
  path: str,