utf-queue-client 1.21.4b1__tar.gz → 1.21.4b2__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 (93) hide show
  1. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/.gitmodules +0 -1
  2. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/Jenkinsfile +1 -1
  3. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/PKG-INFO +2 -1
  4. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/pyproject.toml +4 -1
  5. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/requirements.txt +2 -0
  6. utf_queue_client-1.21.4b2/test/scripts/test_package_release_metadata_cli.py +293 -0
  7. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/scripts}/test_publish_release_info.py +3 -1
  8. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/scripts}/test_publish_test_results.py +6 -2
  9. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/scripts}/test_ubai_copy.py +3 -1
  10. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/scripts}/test_ubai_update_retention.py +1 -1
  11. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/scripts}/test_ubai_upload.py +9 -3
  12. utf_queue_client-1.21.4b2/test-requirements-pydantic-v1.txt +28 -0
  13. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test-requirements.txt +1 -1
  14. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/schemas/utf_queue_models/models/python/generated_models.py +0 -3
  15. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/schemas/utf_queue_models/models/python/generated_models_pydantic_v1.py +1 -21
  16. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/schemas/utf_queue_models/models/python/generated_models_pydantic_v2.py +1 -21
  17. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/schemas/utf_queue_models/schema/queue_message.json +51 -223
  18. utf_queue_client-1.21.4b2/utf_queue_client/scripts/package_release_metadata_cli.py +377 -0
  19. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client.egg-info/PKG-INFO +2 -1
  20. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client.egg-info/SOURCES.txt +18 -16
  21. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client.egg-info/entry_points.txt +2 -0
  22. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client.egg-info/requires.txt +1 -0
  23. utf_queue_client-1.21.4b1/test-requirements-pydantic-v1.txt +0 -14
  24. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/.gitignore +0 -0
  25. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/.idea/.gitignore +0 -0
  26. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/.idea/modules.xml +0 -0
  27. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/.idea/utf_queue_client_python.iml +0 -0
  28. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/.idea/vcs.xml +0 -0
  29. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/.pre-commit-config.yaml +0 -0
  30. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/README.md +0 -0
  31. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/examples/example_async_consumer.py +0 -0
  32. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/setup.cfg +0 -0
  33. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/sonar-project.properties +0 -0
  34. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/.gitattributes +0 -0
  35. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/Dockerfile.script_test +0 -0
  36. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_amqp_connections.py +0 -0
  37. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_async_consumer.py +0 -0
  38. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_connection_retry.py +0 -0
  39. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_data_lake_data_producer.py +0 -0
  40. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_http_producer.py +0 -0
  41. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_opentelemetry_data_producer.py +0 -0
  42. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_rail_data_producer_tests.py +0 -0
  43. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_sqa_test_result_producer.py +0 -0
  44. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/clients}/test_xray_data_producer.py +0 -0
  45. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/conftest.py +0 -0
  46. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/pytest.ini +0 -0
  47. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/script_test.groovy +0 -0
  48. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/scripts}/test_ca_cert.py +0 -0
  49. {utf_queue_client-1.21.4b1/test → utf_queue_client-1.21.4b2/test/scripts}/test_ubai_search.py +0 -0
  50. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/silabs-intermediate.pem +0 -0
  51. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/silabs-root.pem +0 -0
  52. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/stopwatch.py +0 -0
  53. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/test.hex +0 -0
  54. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/test_models.py +0 -0
  55. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/test/test_utils.py +0 -0
  56. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/build_dist.bat +0 -0
  57. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/setup_venv.bat +0 -0
  58. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/silabs-net.pem +0 -0
  59. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/silabs.pem +0 -0
  60. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/update_schema.bat +0 -0
  61. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/upload_to_nexus.bat +0 -0
  62. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/upload_to_pypi.bat +0 -0
  63. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tools/upload_to_testpypi.bat +0 -0
  64. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/tox.ini +0 -0
  65. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/__init__.py +0 -0
  66. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/__init__.py +0 -0
  67. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/async_consumer.py +0 -0
  68. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/base_producer.py +0 -0
  69. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/data_lake_data_producer.py +0 -0
  70. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/http_producer.py +0 -0
  71. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/opentelemetry_data_producer.py +0 -0
  72. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/sqa_test_result_producer.py +0 -0
  73. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/test_rail_data_producer.py +0 -0
  74. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/ubai_artifact_upload_request_producer.py +0 -0
  75. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/clients/xray_data_producer.py +0 -0
  76. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/exceptions/__init__.py +0 -0
  77. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/__init__.py +0 -0
  78. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/base_model.py +0 -0
  79. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/model_factory.py +0 -0
  80. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/schemas/__init__.py +0 -0
  81. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/models/schemas/utf_queue_models/models/python/__init__.py +0 -0
  82. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/scripts/__init__.py +0 -0
  83. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/scripts/publish_release_info_cli.py +0 -0
  84. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/scripts/publish_test_results_cli.py +0 -0
  85. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/scripts/ubai_copy_cli.py +0 -0
  86. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/scripts/ubai_search_cli.py +0 -0
  87. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/scripts/ubai_update_retention_cli.py +0 -0
  88. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/scripts/ubai_upload_cli.py +0 -0
  89. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/utils/__init__.py +0 -0
  90. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/utils/queue_metrics_exporter.py +0 -0
  91. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client/utils/queue_span_exporter.py +0 -0
  92. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client.egg-info/dependency_links.txt +0 -0
  93. {utf_queue_client-1.21.4b1 → utf_queue_client-1.21.4b2}/utf_queue_client.egg-info/top_level.txt +0 -0
@@ -1,4 +1,3 @@
1
1
  [submodule "models/schemas/utf_queue_models"]
2
2
  path = utf_queue_client/models/schemas/utf_queue_models
3
3
  url = ../../utf/utf_queue_models
4
- branch = package_release_pipeline_resource
@@ -126,7 +126,7 @@ pipeline {
126
126
  rm -rf utf_queue_client.egg-info
127
127
  python3 -m build
128
128
 
129
- twine upload dist/*
129
+ twine upload dist/* --verbose
130
130
  '''
131
131
  }
132
132
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: utf-queue-client
3
- Version: 1.21.4b1
3
+ Version: 1.21.4b2
4
4
  Summary: No description provided
5
5
  Author-email: Joe Savage <joe.savage@silabs.com>
6
6
  Keywords: UTF
@@ -14,6 +14,7 @@ Requires-Dist: typing_extensions; python_version < "3.8"
14
14
  Requires-Dist: click
15
15
  Requires-Dist: certifi>=2020.4
16
16
  Requires-Dist: ubai-client>=1.2.0
17
+ Requires-Dist: package-release-metadata-client
17
18
  Requires-Dist: opentelemetry-distro[otlp]
18
19
  Requires-Dist: otel-extensions>=0.1.2
19
20
  Requires-Dist: retry>=0.9.2
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "utf-queue-client"
7
- version = "1.21.4b1"
7
+ version = "1.21.4b2"
8
8
  description = "No description provided"
9
9
  authors = [
10
10
  { name = "Joe Savage", email = "joe.savage@silabs.com" }
@@ -20,6 +20,7 @@ dependencies = [
20
20
  "click",
21
21
  "certifi >= 2020.4",
22
22
  "ubai-client >= 1.2.0",
23
+ "package-release-metadata-client",
23
24
  "opentelemetry-distro[otlp]",
24
25
  "otel-extensions >= 0.1.2",
25
26
  "retry>=0.9.2",
@@ -36,6 +37,8 @@ publish_test_results_cli = "utf_queue_client.scripts.publish_test_results_cli:cl
36
37
  ubai_update_retention_cli = "utf_queue_client.scripts.ubai_update_retention_cli:cli_entrypoint"
37
38
  publish_release_info_cli = "utf_queue_client.scripts.publish_release_info_cli:cli_entrypoint"
38
39
  ubai_copy_cli = "utf_queue_client.scripts.ubai_copy_cli:cli_entrypoint"
40
+ pkgrelease_quality_status_update = "utf_queue_client.scripts.package_release_metadata_cli:update_cli_entrypoint"
41
+ pkgrelease_quality_status_enquiry = "utf_queue_client.scripts.package_release_metadata_cli:enquiry_cli_entrypoint"
39
42
 
40
43
  [tool.setuptools.packages.find]
41
44
  include = ["utf_queue_client"]
@@ -1,3 +1,4 @@
1
+ --extra-index-url https://artifactory-bos.silabs.net/artifactory/api/pypi/infrasw-python-local/simple
1
2
  pika>=1.2.0
2
3
  jsonschema>=3.2.0
3
4
  msgpack>=1.0.2
@@ -8,6 +9,7 @@ typing_extensions; python_version < '3.8'
8
9
  click
9
10
  certifi>=2020.4
10
11
  ubai-client>=1.2.0
12
+ package-release-metadata-client==0.1.0
11
13
  opentelemetry-distro[otlp]
12
14
  otel-extensions>=0.2.4
13
15
  retry>=0.9.2
@@ -0,0 +1,293 @@
1
+ from unittest.mock import MagicMock, patch
2
+
3
+ import pytest
4
+ from click.testing import CliRunner
5
+
6
+ pytest.importorskip("package_release_metadata_client")
7
+
8
+ from utf_queue_client.scripts.package_release_metadata_cli import ( # noqa: E402
9
+ DEV_URL,
10
+ PROD_URL,
11
+ enquiry_cli_entrypoint,
12
+ update_cli_entrypoint,
13
+ )
14
+
15
+ runner = CliRunner()
16
+
17
+ # ---------------------------------------------------------------------------
18
+ # Shared fixtures / helpers
19
+ # ---------------------------------------------------------------------------
20
+
21
+ REQUIRED_UPDATE_ARGS = [
22
+ "--release-name",
23
+ "2.4.1",
24
+ "--build-number",
25
+ "42",
26
+ "--job-url",
27
+ "https://ci/build/1",
28
+ "--stack-name",
29
+ "zigbee",
30
+ "--test-result-type",
31
+ "sanity",
32
+ "--status",
33
+ "pass",
34
+ "--run-num",
35
+ "1",
36
+ ]
37
+
38
+
39
+ def _mock_api(create_return=None, latest_return=None, list_return=None):
40
+ """Build a MagicMock PkgReleaseMetadataApi with pre-configured return values."""
41
+ api = MagicMock()
42
+ qs = api.quality_status_api
43
+ if create_return is not None:
44
+ qs.create_quality_status_api_v1_quality_status_post.return_value = create_return
45
+ if latest_return is not None:
46
+ qs.get_latest_quality_status_api_v1_quality_status_latest_get.return_value = (
47
+ latest_return
48
+ )
49
+ if list_return is not None:
50
+ qs.list_quality_status_api_v1_quality_status_get.return_value = list_return
51
+ return api
52
+
53
+
54
+ # ---------------------------------------------------------------------------
55
+ # pkgrelease_quality_status_update — argument validation
56
+ # ---------------------------------------------------------------------------
57
+
58
+
59
+ def test_update_help_exits_cleanly():
60
+ result = runner.invoke(update_cli_entrypoint, ["--help"])
61
+ assert result.exit_code == 0
62
+ assert "QualityStatusRead" in result.output
63
+
64
+
65
+ def test_update_missing_required_args_fails():
66
+ result = runner.invoke(update_cli_entrypoint, ["--release-name", "2.4.1"])
67
+ assert result.exit_code != 0
68
+ assert "Missing option" in result.output
69
+
70
+
71
+ def test_update_invalid_status_rejected():
72
+ args = REQUIRED_UPDATE_ARGS[:]
73
+ args[args.index("pass")] = "passed" # not in choices
74
+ result = runner.invoke(update_cli_entrypoint, args)
75
+ assert result.exit_code != 0
76
+ assert "'passed' is not" in result.output
77
+
78
+
79
+ @pytest.mark.parametrize("status", ["pass", "fail", "aborted"])
80
+ def test_update_all_valid_statuses_accepted(status):
81
+ args = REQUIRED_UPDATE_ARGS[:]
82
+ args[args.index("pass")] = status
83
+ mock_result = MagicMock(id=1, to_dict=lambda: {"id": 1})
84
+ with patch(
85
+ "utf_queue_client.scripts.package_release_metadata_cli._make_api"
86
+ ) as mock_make:
87
+ mock_make.return_value = _mock_api(create_return=mock_result)
88
+ result = runner.invoke(update_cli_entrypoint, args + ["--retries", "1"])
89
+ assert result.exit_code == 0
90
+
91
+
92
+ # ---------------------------------------------------------------------------
93
+ # pkgrelease_quality_status_update — API routing and URL selection
94
+ # ---------------------------------------------------------------------------
95
+
96
+
97
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
98
+ def test_update_targets_prod_by_default(mock_make):
99
+ mock_result = MagicMock(id=1, to_dict=lambda: {"id": 1})
100
+ mock_make.return_value = _mock_api(create_return=mock_result)
101
+ runner.invoke(update_cli_entrypoint, REQUIRED_UPDATE_ARGS + ["--retries", "1"])
102
+ mock_make.assert_called_once_with(False)
103
+
104
+
105
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
106
+ def test_update_dev_flag_targets_dev(mock_make):
107
+ mock_result = MagicMock(id=1, to_dict=lambda: {"id": 1})
108
+ mock_make.return_value = _mock_api(create_return=mock_result)
109
+ runner.invoke(
110
+ update_cli_entrypoint, REQUIRED_UPDATE_ARGS + ["--dev", "--retries", "1"]
111
+ )
112
+ mock_make.assert_called_once_with(True)
113
+
114
+
115
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
116
+ def test_update_calls_create_api(mock_make):
117
+ mock_result = MagicMock(id=99, to_dict=lambda: {"id": 99})
118
+ api = _mock_api(create_return=mock_result)
119
+ mock_make.return_value = api
120
+ result = runner.invoke(
121
+ update_cli_entrypoint, REQUIRED_UPDATE_ARGS + ["--retries", "1"]
122
+ )
123
+ assert result.exit_code == 0
124
+ api.quality_status_api.create_quality_status_api_v1_quality_status_post.assert_called_once()
125
+
126
+
127
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
128
+ def test_update_optional_fields_forwarded(mock_make):
129
+ mock_result = MagicMock(id=1, to_dict=lambda: {"id": 1})
130
+ api = _mock_api(create_return=mock_result)
131
+ mock_make.return_value = api
132
+ result = runner.invoke(
133
+ update_cli_entrypoint,
134
+ REQUIRED_UPDATE_ARGS
135
+ + [
136
+ "--pass-cnt",
137
+ "80",
138
+ "--fail-cnt",
139
+ "20",
140
+ "--total-cnt",
141
+ "100",
142
+ "--pass-pct",
143
+ "80.0",
144
+ "--sub-stack",
145
+ "core",
146
+ "--retries",
147
+ "1",
148
+ ],
149
+ )
150
+ assert result.exit_code == 0
151
+ call_kwargs = api.quality_status_api.create_quality_status_api_v1_quality_status_post.call_args[
152
+ 0
153
+ ][0]
154
+ assert call_kwargs.pass_cnt == 80
155
+ assert call_kwargs.fail_cnt == 20
156
+ assert call_kwargs.sub_stack == "core"
157
+
158
+
159
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
160
+ def test_update_output_is_json(mock_make):
161
+ mock_result = MagicMock(id=7, to_dict=lambda: {"id": 7, "status": "pass"})
162
+ mock_make.return_value = _mock_api(create_return=mock_result)
163
+ result = runner.invoke(
164
+ update_cli_entrypoint, REQUIRED_UPDATE_ARGS + ["--retries", "1"]
165
+ )
166
+ assert result.exit_code == 0
167
+ import json
168
+
169
+ parsed = json.loads(result.output)
170
+ assert parsed["id"] == 7
171
+
172
+
173
+ # ---------------------------------------------------------------------------
174
+ # pkgrelease_quality_status_enquiry — argument validation
175
+ # ---------------------------------------------------------------------------
176
+
177
+
178
+ def test_enquiry_help_exits_cleanly():
179
+ result = runner.invoke(enquiry_cli_entrypoint, ["--help"])
180
+ assert result.exit_code == 0
181
+ assert "LatestQualityStatusResponse" in result.output
182
+ assert "List[QualityStatusRead]" in result.output
183
+
184
+
185
+ def test_enquiry_missing_release_name_fails():
186
+ result = runner.invoke(enquiry_cli_entrypoint, [])
187
+ assert result.exit_code != 0
188
+ assert "Missing option" in result.output
189
+
190
+
191
+ # ---------------------------------------------------------------------------
192
+ # pkgrelease_quality_status_enquiry — API routing
193
+ # ---------------------------------------------------------------------------
194
+
195
+
196
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
197
+ def test_enquiry_release_name_only_calls_latest(mock_make):
198
+ mock_latest = MagicMock(
199
+ to_dict=lambda: {"release_name": "2.4.1", "build_number": 42, "stacks": []}
200
+ )
201
+ mock_make.return_value = _mock_api(latest_return=mock_latest)
202
+ result = runner.invoke(
203
+ enquiry_cli_entrypoint, ["--release-name", "2.4.1", "--retries", "1"]
204
+ )
205
+ assert result.exit_code == 0
206
+ mock_make.return_value.quality_status_api.get_latest_quality_status_api_v1_quality_status_latest_get.assert_called_once_with(
207
+ release_name="2.4.1", build_number=None
208
+ )
209
+
210
+
211
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
212
+ def test_enquiry_with_build_num_calls_latest(mock_make):
213
+ mock_latest = MagicMock(to_dict=lambda: {})
214
+ mock_make.return_value = _mock_api(latest_return=mock_latest)
215
+ result = runner.invoke(
216
+ enquiry_cli_entrypoint,
217
+ ["--release-name", "2.4.1", "--build-num", "42", "--retries", "1"],
218
+ )
219
+ assert result.exit_code == 0
220
+ mock_make.return_value.quality_status_api.get_latest_quality_status_api_v1_quality_status_latest_get.assert_called_once_with(
221
+ release_name="2.4.1", build_number=42
222
+ )
223
+
224
+
225
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
226
+ def test_enquiry_with_stack_name_calls_list(mock_make):
227
+ mock_make.return_value = _mock_api(list_return=[])
228
+ result = runner.invoke(
229
+ enquiry_cli_entrypoint,
230
+ ["--release-name", "2.4.1", "--stack-name", "zigbee", "--retries", "1"],
231
+ )
232
+ assert result.exit_code == 0
233
+ mock_make.return_value.quality_status_api.list_quality_status_api_v1_quality_status_get.assert_called_once_with(
234
+ release_name="2.4.1",
235
+ build_number=None,
236
+ stack_name="zigbee",
237
+ test_result_type=None,
238
+ )
239
+
240
+
241
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
242
+ def test_enquiry_with_test_result_type_calls_list(mock_make):
243
+ mock_make.return_value = _mock_api(list_return=[])
244
+ result = runner.invoke(
245
+ enquiry_cli_entrypoint,
246
+ ["--release-name", "2.4.1", "--test-result-type", "sanity", "--retries", "1"],
247
+ )
248
+ assert result.exit_code == 0
249
+ mock_make.return_value.quality_status_api.list_quality_status_api_v1_quality_status_get.assert_called_once_with(
250
+ release_name="2.4.1",
251
+ build_number=None,
252
+ stack_name=None,
253
+ test_result_type="sanity",
254
+ )
255
+
256
+
257
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
258
+ def test_enquiry_targets_prod_by_default(mock_make):
259
+ mock_latest = MagicMock(to_dict=lambda: {})
260
+ mock_make.return_value = _mock_api(latest_return=mock_latest)
261
+ runner.invoke(enquiry_cli_entrypoint, ["--release-name", "2.4.1", "--retries", "1"])
262
+ mock_make.assert_called_once_with(False)
263
+
264
+
265
+ @patch("utf_queue_client.scripts.package_release_metadata_cli._make_api")
266
+ def test_enquiry_dev_flag_targets_dev(mock_make):
267
+ mock_latest = MagicMock(to_dict=lambda: {})
268
+ mock_make.return_value = _mock_api(latest_return=mock_latest)
269
+ runner.invoke(
270
+ enquiry_cli_entrypoint, ["--release-name", "2.4.1", "--dev", "--retries", "1"]
271
+ )
272
+ mock_make.assert_called_once_with(True)
273
+
274
+
275
+ # ---------------------------------------------------------------------------
276
+ # _make_api — URL resolution
277
+ # ---------------------------------------------------------------------------
278
+
279
+
280
+ @patch("utf_queue_client.scripts.package_release_metadata_cli.PkgReleaseMetadataApi")
281
+ def test_make_api_uses_prod_url_by_default(mock_cls):
282
+ from utf_queue_client.scripts.package_release_metadata_cli import _make_api
283
+
284
+ _make_api(dev=False)
285
+ mock_cls.assert_called_once_with(server_url=PROD_URL)
286
+
287
+
288
+ @patch("utf_queue_client.scripts.package_release_metadata_cli.PkgReleaseMetadataApi")
289
+ def test_make_api_uses_dev_url_when_dev_true(mock_cls):
290
+ from utf_queue_client.scripts.package_release_metadata_cli import _make_api
291
+
292
+ _make_api(dev=True)
293
+ mock_cls.assert_called_once_with(server_url=DEV_URL)
@@ -41,7 +41,9 @@ def test_publish_release_info(request, publish_release_info):
41
41
  for k, v in publish_release_info:
42
42
  args += ["--data", k, v]
43
43
 
44
- base_dir = os.path.dirname(os.path.dirname(__file__))
44
+ base_dir = os.path.dirname(
45
+ os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
46
+ )
45
47
 
46
48
  @inject_context_to_env
47
49
  def call_cli_script():
@@ -118,7 +118,9 @@ def test_jobstatus_session_data(request, session_start_data, session_stop_data):
118
118
  for k, v in session_stop_data:
119
119
  stop_args += ["--data", k, v]
120
120
 
121
- base_dir = os.path.dirname(os.path.dirname(__file__))
121
+ base_dir = os.path.dirname(
122
+ os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
123
+ )
122
124
 
123
125
  @inject_context_to_env
124
126
  def call_cli_script():
@@ -177,7 +179,9 @@ def test_app_build_results_data(request, app_build_results_data):
177
179
  for k, v in app_build_results_data:
178
180
  args += ["--data", k, v]
179
181
 
180
- base_dir = os.path.dirname(os.path.dirname(__file__))
182
+ base_dir = os.path.dirname(
183
+ os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
184
+ )
181
185
 
182
186
  @inject_context_to_env
183
187
  def call_cli_script():
@@ -101,7 +101,9 @@ def test_ubai_copy_cli(
101
101
  def test_ubai_copy_cli_script(
102
102
  artifact_id, copy_name, copy_extension, copy_metadata, set_environment_variables
103
103
  ):
104
- base_dir = os.path.dirname(os.path.dirname(__file__))
104
+ base_dir = os.path.dirname(
105
+ os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
106
+ )
105
107
 
106
108
  args = [
107
109
  "--artifact_id",
@@ -47,7 +47,7 @@ def test_ubai_search_cli_script(set_environment_variable):
47
47
  [
48
48
  sys.executable,
49
49
  str(
50
- pathlib.Path(__file__).parent.parent
50
+ pathlib.Path(__file__).resolve().parent.parent.parent
51
51
  / os.path.join(
52
52
  "utf_queue_client", "scripts", "ubai_update_retention_cli.py"
53
53
  )
@@ -30,7 +30,9 @@ def metadata():
30
30
  )
31
31
  @pytest.mark.parametrize("use_queue", [True, False])
32
32
  def test_ubai_upload_cli(request, metadata, set_environment_variable, use_queue):
33
- file = os.path.join(os.path.dirname(__file__), "test.hex")
33
+ file = os.path.join(
34
+ os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "test.hex"
35
+ )
34
36
 
35
37
  username = os.environ["UTF_QUEUE_USERNAME"]
36
38
  password = os.environ["UTF_QUEUE_PASSWORD"]
@@ -103,8 +105,12 @@ def test_ubai_upload_cli_large_file(
103
105
  def test_ubai_upload_cli_script(
104
106
  request, metadata, use_queue, set_environment_variables
105
107
  ):
106
- file = os.path.join(os.path.dirname(__file__), "test.hex")
107
- base_dir = os.path.dirname(os.path.dirname(__file__))
108
+ file = os.path.join(
109
+ os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "test.hex"
110
+ )
111
+ base_dir = os.path.dirname(
112
+ os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
113
+ )
108
114
 
109
115
  client_id = request.node.name
110
116
  args = ["--file-path", file, "--client-id", client_id]
@@ -0,0 +1,28 @@
1
+ --extra-index-url https://artifactory-bos.silabs.net/artifactory/api/pypi/infrasw-python-local/simple
2
+ pika>=1.2.0
3
+ jsonschema>=3.2.0
4
+ msgpack>=1.0.2
5
+ datamodel-code-generator
6
+ regex
7
+ typing_extensions; python_version < '3.8'
8
+ click
9
+ certifi>=2020.4
10
+ ubai-client>=1.2.0
11
+ opentelemetry-distro[otlp]
12
+ otel-extensions>=0.2.4
13
+ retry>=0.9.2
14
+ requests
15
+ ndjson~=0.3
16
+ urllib3>=1.25.3,<2.6.0
17
+ pytest
18
+ black
19
+ wheel
20
+ twine
21
+ pytest-cov
22
+ opentelemetry-distro[otlp]==0.35b0
23
+ opentelemetry-instrumentation-urllib3==0.35b0
24
+ otel-extensions-pytest>=0.1.2
25
+ pytest-mock
26
+ pytest-xdist
27
+ pydantic==1.*
28
+ pre-commit
@@ -10,5 +10,5 @@ opentelemetry-instrumentation-urllib3==0.40b0
10
10
  otel-extensions-pytest>=0.1.2
11
11
  pytest-mock
12
12
  pytest-xdist
13
- pydantic==2.*
13
+ pydantic==2.10.6
14
14
  pre-commit
@@ -14,7 +14,6 @@ if IS_PYDANTIC_V1:
14
14
  from .generated_models_pydantic_v1 import SqaAppBuildResult
15
15
  from .generated_models_pydantic_v1 import SqaTestResult
16
16
  from .generated_models_pydantic_v1 import SqaTestSession
17
- from .generated_models_pydantic_v1 import SqaQualityStatus
18
17
  from .generated_models_pydantic_v1 import LogEvent
19
18
  from .generated_models_pydantic_v1 import ExceptionEvent
20
19
  from .generated_models_pydantic_v1 import TestRailResult
@@ -40,7 +39,6 @@ else:
40
39
  from .generated_models_pydantic_v2 import SqaAppBuildResult
41
40
  from .generated_models_pydantic_v2 import SqaTestResult
42
41
  from .generated_models_pydantic_v2 import SqaTestSession
43
- from .generated_models_pydantic_v2 import SqaQualityStatus
44
42
  from .generated_models_pydantic_v2 import LogEvent
45
43
  from .generated_models_pydantic_v2 import ExceptionEvent
46
44
  from .generated_models_pydantic_v2 import TestRailResult
@@ -67,7 +65,6 @@ __all__ = [
67
65
  "SqaAppBuildResult",
68
66
  "SqaTestResult",
69
67
  "SqaTestSession",
70
- "SqaQualityStatus",
71
68
  "LogEvent",
72
69
  "ExceptionEvent",
73
70
  "TestRailResult",
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: queue_message.json
3
- # timestamp: 2026-04-16T19:57:56+00:00
3
+ # timestamp: 2025-11-20T23:53:05+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -222,23 +222,6 @@ class SqaTestSession(BaseModel):
222
222
  )
223
223
 
224
224
 
225
- class SqaQualityStatus(BaseModel):
226
- stackName: constr(max_length=256)
227
- releaseName: constr(max_length=256)
228
- buildNumber: float
229
- testResultType: constr(max_length=256)
230
- total: Optional[float] = None
231
- passCnt: Optional[float] = None
232
- failCnt: Optional[float] = None
233
- skipCnt: Optional[float] = None
234
- blockCnt: Optional[float] = None
235
- jobUrl: constr(max_length=256)
236
- runNum: float
237
- jobStatus: constr(max_length=256)
238
- subStackName: Optional[constr(max_length=256)] = None
239
- startTime: Optional[str] = Field(None, description="ISO-8601 datetime")
240
-
241
-
242
225
  class LogEvent(BaseModel):
243
226
  pass
244
227
 
@@ -341,7 +324,6 @@ class QueueMessage(BaseModel):
341
324
  "EXCEPTION_EVENT",
342
325
  "LOG_EVENT",
343
326
  "OPENTELEMETRY_DATA",
344
- "SQA_TEST_EVENT",
345
327
  "TEST_RAIL_EVENT",
346
328
  "UTF_TEST_EVENT",
347
329
  "XRAY_EVENT",
@@ -352,8 +334,6 @@ class QueueMessage(BaseModel):
352
334
  "IMPORT_TEST_EXECUTION",
353
335
  "SESSION_START",
354
336
  "SESSION_STOP",
355
- "SQA_TEST_RUN_START",
356
- "SQA_TEST_RUN_STOP",
357
337
  "TEST_RESULT",
358
338
  "TEST_RESULT_APP",
359
339
  ]
@@ -1,6 +1,6 @@
1
1
  # generated by datamodel-codegen:
2
2
  # filename: queue_message.json
3
- # timestamp: 2026-04-16T19:57:57+00:00
3
+ # timestamp: 2025-11-20T23:53:07+00:00
4
4
 
5
5
  from __future__ import annotations
6
6
 
@@ -220,23 +220,6 @@ class SqaTestSession(BaseModel):
220
220
  )
221
221
 
222
222
 
223
- class SqaQualityStatus(BaseModel):
224
- stackName: constr(max_length=256)
225
- releaseName: constr(max_length=256)
226
- buildNumber: float
227
- testResultType: constr(max_length=256)
228
- total: Optional[float] = None
229
- passCnt: Optional[float] = None
230
- failCnt: Optional[float] = None
231
- skipCnt: Optional[float] = None
232
- blockCnt: Optional[float] = None
233
- jobUrl: constr(max_length=256)
234
- runNum: float
235
- jobStatus: constr(max_length=256)
236
- subStackName: Optional[constr(max_length=256)] = None
237
- startTime: Optional[str] = Field(None, description="ISO-8601 datetime")
238
-
239
-
240
223
  class LogEvent(BaseModel):
241
224
  pass
242
225
 
@@ -345,7 +328,6 @@ class QueueMessage(BaseModel):
345
328
  "EXCEPTION_EVENT",
346
329
  "LOG_EVENT",
347
330
  "OPENTELEMETRY_DATA",
348
- "SQA_TEST_EVENT",
349
331
  "TEST_RAIL_EVENT",
350
332
  "UTF_TEST_EVENT",
351
333
  "XRAY_EVENT",
@@ -356,8 +338,6 @@ class QueueMessage(BaseModel):
356
338
  "IMPORT_TEST_EXECUTION",
357
339
  "SESSION_START",
358
340
  "SESSION_STOP",
359
- "SQA_TEST_RUN_START",
360
- "SQA_TEST_RUN_STOP",
361
341
  "TEST_RESULT",
362
342
  "TEST_RESULT_APP",
363
343
  ]