scriptworker 63.2.0__tar.gz → 63.3.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 (31) hide show
  1. {scriptworker-63.2.0 → scriptworker-63.3.0}/HISTORY.rst +22 -0
  2. {scriptworker-63.2.0 → scriptworker-63.3.0}/PKG-INFO +1 -1
  3. {scriptworker-63.2.0 → scriptworker-63.3.0}/pyproject.toml +1 -1
  4. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/config.py +13 -2
  5. scriptworker-63.3.0/src/scriptworker/constants.py +840 -0
  6. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/context.py +11 -3
  7. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/utils.py +65 -14
  8. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/worker.py +4 -2
  9. scriptworker-63.2.0/src/scriptworker/constants.py +0 -822
  10. {scriptworker-63.2.0 → scriptworker-63.3.0}/.gitignore +0 -0
  11. {scriptworker-63.2.0 → scriptworker-63.3.0}/CONTRIBUTING.rst +0 -0
  12. {scriptworker-63.2.0 → scriptworker-63.3.0}/LICENSE +0 -0
  13. {scriptworker-63.2.0 → scriptworker-63.3.0}/README.rst +0 -0
  14. {scriptworker-63.2.0 → scriptworker-63.3.0}/renovate.json +0 -0
  15. {scriptworker-63.2.0 → scriptworker-63.3.0}/scripts/gen_ed25519_key.py +0 -0
  16. {scriptworker-63.2.0 → scriptworker-63.3.0}/scriptworker.yaml.tmpl +0 -0
  17. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/__init__.py +0 -0
  18. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/artifacts.py +0 -0
  19. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/client.py +0 -0
  20. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/cot/__init__.py +0 -0
  21. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/cot/generate.py +0 -0
  22. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/cot/verify.py +0 -0
  23. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/data/cot_v1_schema.json +0 -0
  24. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/data/scriptworker_task_schema.json +0 -0
  25. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/ed25519.py +0 -0
  26. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/exceptions.py +0 -0
  27. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/github.py +0 -0
  28. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/log.py +0 -0
  29. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/task.py +0 -0
  30. {scriptworker-63.2.0 → scriptworker-63.3.0}/src/scriptworker/task_process.py +0 -0
  31. {scriptworker-63.2.0 → scriptworker-63.3.0}/tox.ini +0 -0
@@ -4,6 +4,28 @@ Change Log
4
4
  All notable changes to this project will be documented in this file.
5
5
  This project adheres to `Semantic Versioning <http://semver.org/>`__.
6
6
 
7
+ 63.3.0 - 2026-08-05
8
+ -------------------
9
+
10
+ Added
11
+ ~~~~~
12
+
13
+ - `cot_product` is now optional. When unset, `by-cot-product` mappings resolve to
14
+ `None`, and `check_config` requires `verify_chain_of_trust` to be off (#810)
15
+ - `download_file` accepts an optional `expected_content_type` kwarg that rejects
16
+ `text/html` responses when another type was requested (#791)
17
+
18
+ Fixed
19
+ ~~~~~
20
+
21
+ - Event loop creation in a fresh process, which raised a `RuntimeError` on
22
+ Python 3.14 since `asyncio.get_event_loop()` no longer creates a loop (#811)
23
+ - JSON/YAML load failures now include the file path and, for downloaded
24
+ artifacts, the source URL in the error message (#791)
25
+ - `load_json_or_yaml_from_url` retries the download when the cached file fails
26
+ to parse, turning transient artifact-server glitches into self-healing
27
+ retries instead of hard failures (#791)
28
+
7
29
  63.2.0 - 2026-06-18
8
30
  -------------------
9
31
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scriptworker
3
- Version: 63.2.0
3
+ Version: 63.3.0
4
4
  Summary: Taskcluster scriptworker
5
5
  Author-email: Mozilla Release Engineering <releng@mozilla.com>
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "scriptworker"
3
- version = "63.2.0"
3
+ version = "63.3.0"
4
4
  description = "Taskcluster scriptworker"
5
5
  authors = [
6
6
  { name = "Mozilla Release Engineering", email = "releng@mozilla.com" },
@@ -125,11 +125,17 @@ def check_config(config, path):
125
125
  if key not in DEFAULT_CONFIG:
126
126
  messages.append("Unknown key {} in {}!".format(key, path))
127
127
  continue
128
+ is_by_cot_product = isinstance(DEFAULT_CONFIG[key], Mapping) and "by-cot-product" in DEFAULT_CONFIG[key]
128
129
  if value is None:
129
- messages.append(_VALUE_UNDEFINED_MESSAGE.format(path=path, key=key))
130
+ if key != "cot_product" and not is_by_cot_product:
131
+ messages.append(_VALUE_UNDEFINED_MESSAGE.format(path=path, key=key))
130
132
  else:
131
133
  value_type = type(value)
132
- if isinstance(DEFAULT_CONFIG[key], Mapping) and "by-cot-product" in DEFAULT_CONFIG[key]:
134
+ if key == "cot_product":
135
+ # `cot_product`'s own default is `None`, so its type can't be
136
+ # inferred from `DEFAULT_CONFIG` the way other keys' can.
137
+ default_type = str
138
+ elif is_by_cot_product:
133
139
  default_type = type(DEFAULT_CONFIG[key]["by-cot-product"][config["cot_product"]])
134
140
  else:
135
141
  default_type = type(DEFAULT_CONFIG[key])
@@ -139,6 +145,8 @@ def check_config(config, path):
139
145
  messages.append(_VALUE_UNDEFINED_MESSAGE.format(path=path, key=key))
140
146
  if key in ("provisioner_id", "worker_group", "worker_type", "worker_id") and not _is_id_valid(value):
141
147
  messages.append('{} doesn\'t match "{}" (required by Taskcluster)'.format(key, _GENERIC_ID_REGEX.pattern))
148
+ if config.get("cot_product") is None and config.get("verify_chain_of_trust"):
149
+ messages.append("{} verify_chain_of_trust can't be True when cot_product is not set!".format(path))
142
150
  return messages
143
151
 
144
152
 
@@ -161,6 +169,9 @@ def apply_product_config(config):
161
169
 
162
170
  for key in config:
163
171
  if isinstance(config[key], Mapping) and "by-cot-product" in config[key]:
172
+ if cot_product is None:
173
+ config[key] = None
174
+ continue
164
175
  try:
165
176
  config[key] = config[key]["by-cot-product"][cot_product]
166
177
  except KeyError: