gowalk-cicd 1.0.157 → 1.0.158

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.
@@ -1 +1 @@
1
- 1.0.157
1
+ 1.0.158
@@ -67,6 +67,14 @@ UNIVERSAL_IDIOMS = frozenset({"universal"})
67
67
  #: runtime documentation nests it under NSExtensionAttributes and the delivery
68
68
  #: validator reads it directly under NSExtension, so a bundle that satisfies only
69
69
  #: the documented location is delivered and then refused as "not specified".
70
+ #: A `forbidden` row names a key the validator refuses to SEE. A WidgetKit
71
+ #: extension has no principal class: it enters through its @main WidgetBundle,
72
+ #: Xcode's own template ships NSExtensionPointIdentifier alone, and a bundle
73
+ #: that adds NSExtensionPrincipalClass is delivered and then refused with
74
+ #: "Validation failed (409) Unexpected Info.plist key. Unexpected key
75
+ #: NSExtensionPrincipalClass found in extension Info.plist for
76
+ #: Payload/<App>.app/PlugIns/<Widget>.appex". Demanding the key here refused
77
+ #: every correct WidgetKit build (Sunnah 1.0.1 (16)) for a binary Apple accepts.
70
78
  EXTENSION_KEYS = {
71
79
  "com.apple.broadcast-services-upload": (
72
80
  {"key": "RPBroadcastProcessMode", "path": (),
@@ -77,7 +85,9 @@ EXTENSION_KEYS = {
77
85
  {"key": "NSExtensionPrincipalClass", "path": (), "values": (), "itms": "ITMS-90362"},
78
86
  ),
79
87
  "com.apple.widgetkit-extension": (
80
- {"key": "NSExtensionPrincipalClass", "path": (), "values": (), "itms": "ITMS-90362"},
88
+ {"key": "NSExtensionPrincipalClass", "path": (), "forbidden": True,
89
+ "reason": "a WidgetKit extension enters through its @main WidgetBundle",
90
+ "itms": "Unexpected Info.plist key"},
81
91
  ),
82
92
  }
83
93
 
@@ -335,10 +345,21 @@ def check_extension_keys(ctx: dict) -> list[dict]:
335
345
  for step in rule["path"]:
336
346
  node = node.get(step) if isinstance(node, dict) else None
337
347
  value = node.get(rule["key"]) if isinstance(node, dict) else None
348
+ where = "NSExtension" + "".join("." + step for step in rule["path"])
349
+ if rule.get("forbidden"):
350
+ if value is None:
351
+ continue
352
+ failures.append({
353
+ "itms": rule["itms"],
354
+ "message": (f"{name}: {where}.{rule['key']} is present; Apple's delivery "
355
+ f"validator refuses it for {point} as an unexpected Info.plist key."),
356
+ "next": (f"Remove {where}.{rule['key']} from the extension's Info.plist; "
357
+ f"{rule['reason']}."),
358
+ })
359
+ continue
338
360
  legal = rule["values"]
339
361
  if value is not None and (not legal or value in legal):
340
362
  continue
341
- where = "NSExtension" + "".join("." + step for step in rule["path"])
342
363
  elsewhere = ""
343
364
  attributes = extension.get("NSExtensionAttributes")
344
365
  if isinstance(attributes, dict) and rule["key"] in attributes and not rule["path"]:
@@ -200,6 +200,27 @@ class BundleTests(unittest.TestCase):
200
200
  self.assertEqual(self.codes(answer), ["ITMS-90362"])
201
201
  self.assertIn("not an accepted value", answer["failures"][0]["message"])
202
202
 
203
+ def test_a_widgetkit_extension_with_only_its_point_identifier_passes(self):
204
+ self.write_info()
205
+ self.extension("SunnahWidget.appex", {
206
+ "NSExtensionPointIdentifier": "com.apple.widgetkit-extension",
207
+ })
208
+ answer = preflight.inspect(self.app, only={"extension_keys"})
209
+ self.assertTrue(answer["ok"], answer["failures"])
210
+
211
+ def test_a_widgetkit_principal_class_is_refused_and_explained(self):
212
+ self.write_info()
213
+ self.extension("SunnahWidget.appex", {
214
+ "NSExtensionPointIdentifier": "com.apple.widgetkit-extension",
215
+ "NSExtensionPrincipalClass": "$(PRODUCT_MODULE_NAME).SunnahWidgetBundle",
216
+ })
217
+ answer = preflight.inspect(self.app, only={"extension_keys"})
218
+ self.assertEqual(self.codes(answer), ["Unexpected Info.plist key"])
219
+ failure = answer["failures"][0]
220
+ self.assertIn("NSExtension.NSExtensionPrincipalClass is present", failure["message"])
221
+ self.assertIn("Remove NSExtension.NSExtensionPrincipalClass", failure["next"])
222
+ self.assertIn("@main WidgetBundle", failure["next"])
223
+
203
224
  def test_an_unknown_extension_point_is_left_alone(self):
204
225
  self.write_info()
205
226
  self.extension("Other.appex", {"NSExtensionPointIdentifier": "com.example.unknown"})
@@ -1 +1 @@
1
- 1.0.157
1
+ 1.0.158
@@ -1 +1 @@
1
- 1.0.157
1
+ 1.0.158
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gowalk-cicd",
3
- "version": "1.0.157",
3
+ "version": "1.0.158",
4
4
  "description": "Zero-config GitHub Actions delivery for iOS TestFlight and Android Google Play.",
5
5
  "type": "module",
6
6
  "bin": {