← 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
M shopify/scripts/enrich-color-details-local.py
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 →