[object Object]

← back to Designer Wallcoverings

auto-save: 2026-07-07T10:30:01 (3 files) — pending-approval/boost-filter-consolidation-2026-06-25 shopify/scripts/enrich-color-details-local.py vendor-scrapers/china-seas-refresh

d43915e2e28bdf43d9042e914a3fb2d52e43aad8 · 2026-07-07 10:30:04 -0700 · Steve Abrams

Files touched

Diff

commit d43915e2e28bdf43d9042e914a3fb2d52e43aad8
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Jul 7 10:30:04 2026 -0700

    auto-save: 2026-07-07T10:30:01 (3 files) — pending-approval/boost-filter-consolidation-2026-06-25 shopify/scripts/enrich-color-details-local.py vendor-scrapers/china-seas-refresh
---
 shopify/scripts/enrich-color-details-local.py | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/shopify/scripts/enrich-color-details-local.py b/shopify/scripts/enrich-color-details-local.py
index 62b8e8d8..b5f5791b 100644
--- a/shopify/scripts/enrich-color-details-local.py
+++ b/shopify/scripts/enrich-color-details-local.py
@@ -37,10 +37,22 @@ except ImportError:
     sys.exit("PIL required: pip3 install Pillow")
 
 
-def gql(query, variables=None):
+def gql(query, variables=None, tries=4):
+    """GraphQL with retry+backoff — self-heals transient throttle/5xx that previously
+    surfaced as a bare KeyError('data')."""
     body = json.dumps({'query': query, 'variables': variables or {}}).encode()
-    req = urllib.request.Request(API, body, {'X-Shopify-Access-Token': TOKEN, 'Content-Type': 'application/json'})
-    return json.load(urllib.request.urlopen(req, timeout=60))
+    last = None
+    for attempt in range(tries):
+        try:
+            req = urllib.request.Request(API, body, {'X-Shopify-Access-Token': TOKEN, 'Content-Type': 'application/json'})
+            d = json.load(urllib.request.urlopen(req, timeout=60))
+            if 'data' in d and d['data'] is not None:
+                return d
+            last = d.get('errors', d)  # throttled / error-only response → retry
+        except Exception as e:
+            last = e
+        time.sleep(1.5 * (attempt + 1))  # linear backoff
+    raise RuntimeError(f"gql failed after {tries} tries: {str(last)[:120]}")
 
 
 def get_products(ids, query_str, limit):

← f1fea763 cadence: Alan Campbell productType fallback Wallcovering->Fa  ·  back to Designer Wallcoverings  ·  contrarian pass 2 fixes: neutral cool-grey lexicon (Mist/Fog d8edd9bf →