diff --git a/get_specs.py b/get_specs.py index 7a17f04..17f3801 100755 --- a/get_specs.py +++ b/get_specs.py @@ -5,7 +5,7 @@ import sys import read_datasheet from alive_progress import alive_bar import requests -#import time +import time import json import subprocess from util import fprint @@ -27,29 +27,78 @@ def check_internet(url='https://belden.com', timeout=5): def query_search(partnum, source): - """token_url = "https://www.belden.com/coveo/rest/token?t=" + str(int(time.time())) - with requests.get(token_url) as r: - out = json.loads(r.content) - token = out["token"] - search_url = "https://www.belden.com/coveo/rest/search" - search_data ='{ "q": "' + str(partnum) + '", "sortCriteria": "relevancy", "numberOfResults": "250", "sortCriteria": "@catalogitemwebdisplaypriority ascending", "searchHub": "products-only-search", "pipeline": "Site Search", "maximumAge": "900000", "tab": "products-search", "locale": "en" }' - #"aq": "", "cq": "((@z95xlanguage==en) (@z95xlatestversion==1) (@source==\\"Coveo_web_index - rg-nc-prod-sitecore-prod\\")) OR (@source==(\\"website_001002_catalog_index-rg-nc-prod-sitecore-prod\\",\\"website_001002_Category_index-rg-nc-prod-sitecore-prod\\"))", "firstResult": "0", "categoryFacets": "[{\\"field\\":\\"@catalogitemcategories\\",\\"path\\":[],\\"injectionDepth\\":1000,\\"maximumNumberOfValues\\":6,\\"delimitingCharacter\\":\\"|\\"}]", "facetOptions": "{}", "groupBy": "" }' - #fprint(search_data) - fprint(json.loads(search_data)) - #search_data = '{ "q": "' + str(partnum) + '" }' - fprint(search_data) - headers = headers = { - 'Authorization': f'Bearer {token}', - 'Content-Type': 'application/json' - } - with requests.post(search_url, headers=headers, data=search_data) as r: - fprint(r.text)""" - - # TODO: Reimplement in python - # Bash script uses some crazy json formatting that I could not figure out - # Despite the fact that I wrote it - # So I'll just leave it, becuase it works. if source == "Belden": + token_url = "https://www.belden.com/coveo/rest/token?t=" + str(int(time.time())) + with requests.get(token_url) as r: + out = json.loads(r.content) + token = out["token"] + search_url = "https://www.belden.com/coveo/rest/search" + + # Ridiculous search parameters extracted from website. Do not touch + search_data = r"""{ "q": "{QUERY}", "sortCriteria": "relevancy", "numberOfResults": "250", "sortCriteria": "@catalogitemwebdisplaypriority ascending", "searchHub": "products-only-search", "pipeline": "Site Search", "maximumAge": "900000", "tab": "products-search", "locale": "en", "aq": "(NOT @z95xtemplate==(ADB6CA4F03EF4F47B9AC9CE2BA53FF97,FE5DD82648C6436DB87A7C4210C7413B)) ((@syssource==\"website_001002_catalog_index-rg-nc-prod-sitecore-prod\" @catalogitemprimarycategorypublished==true)) ((@catalogitemregionavailable=Global) (@z95xlanguage==en))", "cq": "((@z95xlanguage==en) (@z95xlatestversion==1) (@source==\"Coveo_web_index - rg-nc-prod-sitecore-prod\")) OR (@source==(\"website_001002_catalog_index-rg-nc-prod-sitecore-prod\",\"website_001002_Category_index-rg-nc-prod-sitecore-prod\"))", "firstResult": "0" }, "categoryFacets": "[{\"field\":\"@catalogitemcategories\",\"path\":[],\"injectionDepth\":1000,\"maximumNumberOfValues\":6,\"delimitingCharacter\":\"|\"}]", "facetOptions": "{}", "groupBy": " [{\"field\":\"@contenttype\",\"maximumNumberOfValues\":6,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[\"Products\"],\"queryOverride\":\"{QUERY}\",\"advancedQueryOverride\":\"(NOT @z95xtemplate==(ADB6CA4F03EF4F47B9AC9CE2BA53FF97,FE5DD82648C6436DB87A7C4210C7413B)) ((((((((@z95xpath=3324AF2D58F64C0FB725521052F679D2 @z95xid<>3324AF2D58F64C0FB725521052F679D2) ((@z95xpath=C292F3A37B3A4E6BAB345DF87ADDE516 @z95xid<>C292F3A37B3A4E6BAB345DF87ADDE516) @z95xtemplate==E4EFEB787BDC4B1A908EFC64D56CB2A4)) OR ((@z95xpath=723501A864754FEEB8AE377E4C710271 @z95xid<>723501A864754FEEB8AE377E4C710271) ((@z95xpath=600114EAB0E5407A84AAA9F0985B6575 @z95xid<>600114EAB0E5407A84AAA9F0985B6575) @z95xtemplate==2BE4FD6B3B2C49EBBD9E1F6C92238B05))) OR (@syssource==\\"website_001002_catalog_index-rg-nc-prod-sitecore-prod\\" @catalogitemprimarycategorypublished==true)) OR ((@z95xpath=3324AF2D58F64C0FB725521052F679D2 @z95xid<>3324AF2D58F64C0FB725521052F679D2) @z95xpath<>C292F3A37B3A4E6BAB345DF87ADDE516)) OR @syssource==\\"website_001002_Category_index-rg-nc-prod-sitecore-prod\\") NOT @z95xtemplate==(ADB6CA4F03EF4F47B9AC9CE2BA53FF97,FE5DD82648C6436DB87A7C4210C7413B))) ((@catalogitemregionavailable=Global) (@z95xlanguage==en) OR (@contenttype=(Blogs,Resources,Other)) (NOT @ez120xcludefromcoveo==1))\",\"constantQueryOverride\":\"((@z95xlanguage==en) (@z95xlatestversion==1) (@source==\\"Coveo_web_index - rg-nc-prod-sitecore-prod\\")) OR (@source==(\\"website_001002_catalog_index-rg-nc-prod-sitecore-prod\\",\\"website_001002_Category_index-rg-nc-prod-sitecore-prod\\"))\"},{\"field\":\"@catalogitembrand\",\"maximumNumberOfValues\":6,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@catalogitemenvironment\",\"maximumNumberOfValues\":6,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@catalogitemregionalavailability\",\"maximumNumberOfValues\":6,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@prez45xtez120xt\",\"maximumNumberOfValues\":5,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@tags\",\"maximumNumberOfValues\":4,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@facetassettype\",\"maximumNumberOfValues\":3,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@facetbrand\",\"maximumNumberOfValues\":3,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@facetmarket\",\"maximumNumberOfValues\":6,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@facetsolution\",\"maximumNumberOfValues\":6,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@facetsearchcontentpagetype\",\"maximumNumberOfValues\":6,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]}]" }""" + search_data = search_data.replace(r"{QUERY}", partnum) + #"aq": "", "cq": "((@z95xlanguage==en) (@z95xlatestversion==1) (@source==\\"Coveo_web_index - rg-nc-prod-sitecore-prod\\")) OR (@source==(\\"website_001002_catalog_index-rg-nc-prod-sitecore-prod\\",\\"website_001002_Category_index-rg-nc-prod-sitecore-prod\\"))", "firstResult": "0", "categoryFacets": "[{\\"field\\":\\"@catalogitemcategories\\",\\"path\\":[],\\"injectionDepth\\":1000,\\"maximumNumberOfValues\\":6,\\"delimitingCharacter\\":\\"|\\"}]", "facetOptions": "{}", "groupBy": "" }' + #fprint(search_data) + #fprint(json.loads(search_data)) + #search_data = '{ "q": "' + str(partnum) + '" }' + #fprint(search_data) + headers = headers = { + 'Authorization': f'Bearer {token}', + 'Content-Type': 'application/json' + } + try: + with requests.post(search_url, headers=headers, data=search_data) as r: + a = r.text + a = json.loads(a) + idx = -1 + name = "" + for partid in range(len(a["results"])): + name = a["results"][partid]["title"] + if name != partnum: + if name.find(partnum) >= 0: + idx = partid + break + elif partnum.find(name) >= 0: + idx = partid + break + + else: + idx = partid + break + + if idx < 0: + fprint("Could not find part in API: " + partnum) + return False + fprint("Search result found: result " + str(idx) + ", for ID " + name) + #urlname = a["results"][0]["raw"]["catalogitemurlname"] + img = a["results"][idx]["raw"]["catalogitemimageurl"] + img = img[0:img.index("?")] + uri = a["results"][idx]["raw"]["clickableuri"] + dsid = a["results"][idx]["raw"]["catalogitemdatasheetid"] + brand = a["results"][idx]["raw"]["catalogitembrand"] + desc = a["results"][idx]["raw"]["catalogitemlongdesc"] + shortdesc = a["results"][idx]["raw"]["catalogitemshortdesc"] + a = json.dumps(a["results"][idx], indent=2) + #print(a, urlname, img, uri, dsurl) + + out = dict() + out["url"] = "https://www.belden.com/products/" + uri + out["datasheet"] = "https://catalog.belden.com/techdata/EN/" + dsid + "_techdata.pdf" + out["brand"] = brand + out["name"] = shortdesc + out["description"] = desc + out["image"] = "https://www.belden.com" + img + out["partnum"] = name + #print(out) + return out + except: + print("falied to search with API. Falling back to datasheet lookup.") + return False + + + # Original bash script + # superceded by above + if source == "Belden_shell": command = ["./query-search.sh", partnum] result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) if result.returncode != 0: # error @@ -66,27 +115,28 @@ def query_search(partnum, source): #print(data) try: if data["Count"] > 0: - print(data["Results"][0]["Url"]) - result = data["Results"][0] - if result["Url"].split("/")[-1] == partnum: - #print(partnum) - print(result["Html"]) - try: - imgidx = result["Html"].index(" 1): # Use query - search_result = query_search(partnum.replace(" ", ""), dstype) + search_result = query_search(partnum, dstype) # Try to use belden.com search if search_result is not False: # Download high resolution part image if available and needed + partnum = search_result["partnum"] + output_dir = "cables/" + partnum + path = output_dir + "/datasheet.pdf" + bartext = "Downloading files for part " + partnum + bar.text = bartext + if not os.path.exists(output_dir + "/found_part_hires"): if _download_image(search_result["image"], output_dir): fprint("Downloaded hi-res part image for " + partnum) @@ -245,17 +302,48 @@ def get_multi(partnums): # Failed to download with search or guess :( else: - fprint("Failed to download datasheet for part " + partnum) - bar.text = "Failed to download datasheet for part " + partnum - failed.append(partnum) - bar(skipped=True) - bar(skipped=True) + return False + return True # We already have a hi-res image and the datasheet - perfect! else: fprint("Using cached hi-res part image for " + partnum) __use_cached_datasheet(partnum, path, output_dir, dstype) + return True + for fullpartnum in partnums: + if fullpartnum[0:2] == "BL": # catalog.belden.com entry + partnum = fullpartnum[2:] + dstype = "Belden" + elif fullpartnum[0:2] == "AW": + partnum = fullpartnum[2:] + dstype = "Alphawire" + else: + dstype = "Belden" # guess + partnum = fullpartnum + if not run_search(partnum): + success = False + if len(partnum.split(" ")) > 1: + for name in partnum.split(" "): + fprint("Retrying with alternate name: " + name) + if(run_search(name)): + success = True + break + time.sleep(delay) + if not success: + namestripped = partnum.strip(" ") + fprint("Retrying with alternate name: " + namestripped) + if(run_search(namestripped)): + success = True + time.sleep(delay) + if not success: + fprint("Failed to download datasheet for part " + partnum) + bar.text = "Failed to download datasheet for part " + partnum + failed.append(partnum) + bar(skipped=True) + bar(skipped=True) + time.sleep(delay) + if len(failed) > 0: fprint("Failed to download:") for partnum in failed: @@ -268,22 +356,73 @@ def get_multi(partnums): if __name__ == "__main__": - partnums = ["BL7958A", "BL10GXS12", "BLRST 5L-RKT 5L-949", -"BL10GXS13", -"BL10GXW12", -"BL10GXW13", -"BL2412", -"BL2413", -"BLOSP6AU", -"BLFI4D024P9", -"BLFISD012R9", -"BLFDSD012A9", -"BLFSSL024NG", -"BLFISX006W0", -"BLFISX00103", -"BLC6D1100007" + # partnums = ["BLFISX012W0", "BL7958A", "BL10GXS12", "BLRST 5L-RKT 5L-949", + # "BL10GXS13", + # "BL10GXW12", + # "BL10GXW13", + # "BL2412", + # "BL2413", + # "BLOSP6AU", + # "BLFI4D024P9", + # "BLFISD012R9", + # "BLFDSD012A9", + # "BLFSSL024NG", + # "BLFISX006W0", + # "BLFISX00103", + # "BLC6D1100007" + # ] + partnums = [ + # Actual cables in Jukebox + "AW86104CY", + "AW3050", + "AW6714", + "AW1172C", + "AW2211/4", + + "BLTF-1LF-006-RS5N", + "BLTF-SD9-006-RI5N", + "BLTT-SLG-024-HTNN", + "BLFISX012W0", + "BLFI4X012W0", + "BLSPE101 006Q", + "BLSPE102 006Q", + "BL7922A 010Q", + "BL7958A 008Q", + "BLIOP6U 010Q", + "BL10GXW13 D15Q", + "BL10GXW53 D15Q", + "BL29501F 010Q", + "BL29512 010Q", + "BL3106A 010Q", + "BL9841 060Q", + "BL3105A 010Q", + "BL3092A 010Q", + "BL8760 060Q", + "BL6300UE 008Q", + "BL6300FE 009Q", + "BLRA500P 006Q", + + + # Some ones I picked, including some invalid ones + "BL10GXS12", + "BLRST 5L-RKT 5L-949", + "BL10GXS13", + "BL10GXW12", + "BL10GXW13", + "BL2412", + "BL2413", + "BLOSP6AU", + "BLFI4D024P9", + "BLFISD012R9", + "BLFDSD012A9", + "BLFSSL024NG", + "BLFISX006W0", + "BLFISX00103", + "BLC6D1100007" + ] - get_multi(partnums) - #query_search("3248", "Alphawire") + #query_search("86104CY", "Alphawire") + get_multi(partnums, 0.25) + #query_search("10GXS13", "Belden") diff --git a/read_datasheet.py b/read_datasheet.py index ef54a7c..041856b 100755 --- a/read_datasheet.py +++ b/read_datasheet.py @@ -2,6 +2,8 @@ # Parse Belden catalog techdata datasheets +import pandas as pd +pd.set_option('future.no_silent_downcasting', True) from PyPDF2 import PdfReader import camelot import numpy as np @@ -11,6 +13,11 @@ import json from util import fprint import uuid from util import run_cmd +import os + +def touch(path): + with open(path, 'a'): + os.utime(path, None) def parse(filename, output_dir, partnum, dstype): @@ -23,6 +30,7 @@ def parse(filename, output_dir, partnum, dstype): reader = PdfReader(filename) page = reader.pages[0] table_list = {} + for table in tables: table.df.infer_objects(copy=False) table.df.replace('', np.nan, inplace=True) @@ -90,6 +98,7 @@ def parse(filename, output_dir, partnum, dstype): # Table parsing and reordring tables = dict() + torename = dict() previous_table = "" for table_name in table_list.keys(): # determine shape: horizontal or vertical @@ -121,7 +130,8 @@ def parse(filename, output_dir, partnum, dstype): for table_name_2 in table_list.keys(): if table_name_2.find(table.iloc[-1, 0]) >= 0: # Name taken from table directly above - this table does not have a name - table_list["Specs " + str(len(tables))] = table_list.pop(table_name_2, None) # rename table to arbitrary altername name + torename[table_name_2] = "Specs " + str(len(tables)) + #table_list["Specs " + str(len(tables))] = table_list[table_name_2] # rename table to arbitrary altername name break if vertical: @@ -142,21 +152,21 @@ def parse(filename, output_dir, partnum, dstype): # multi-page table check if dstype == "Belden": if table_name.isdigit() and len(tables) > 1: - fprint(table_name) - fprint(previous_table) + #fprint(table_name) + #fprint(previous_table) main_key = previous_table cont_key = table_name - fprint(tables) + #fprint(tables) if vertical == False: main_keys = list(tables[main_key].keys()) for i, (cont_key, cont_values) in enumerate(tables[cont_key].items()): if i < len(main_keys): - fprint(tables[main_key][main_keys[i]]) - tables[main_key][main_keys[i]] = (tables[main_key][main_keys[i]] + (cont_key,) + cont_values) + #fprint(tables[main_key][main_keys[i]]) + tables[main_key][main_keys[i]] = (tuple(tables[main_key][main_keys[i]]) + (cont_key,) + cont_values) del tables[table_name] @@ -167,6 +177,10 @@ def parse(filename, output_dir, partnum, dstype): previous_table = table_name + # remove renamed tables + for table_name in torename.keys(): + tables[torename[table_name]] = tables[table_name] + del tables[table_name] # remove multi-line values that occasionally squeak through def replace_newlines_in_dict(d): for key, value in d.items(): @@ -195,12 +209,12 @@ def parse(filename, output_dir, partnum, dstype): - print(output_table) + #print(output_table) - run_cmd("rm " + output_dir + "/*.json") # not reliable! + run_cmd("rm \"" + output_dir + "\"/*.json") # not reliable! with open(output_dir + "/" + output_table["searchspecs"]["id"] + ".json", 'w') as json_file: json.dump(output_table["searchspecs"], json_file) - + touch(output_dir + "/parsed") return output_table @@ -217,7 +231,7 @@ def flatten(tables): # If it fails again, return the original string. return s out = dict() - print("{") + #print("{") for table in tables.keys(): for key in tables[table].keys(): if len(key) < 64: @@ -228,13 +242,19 @@ def flatten(tables): fullkeyname = (table + ": " + keyname).replace(".","") if type(tables[table][key]) is not tuple: out[fullkeyname] = convert_to_number(tables[table][key]) - print("\"" + keyname + "\":", "\"" + str(out[fullkeyname]) + "\",") + #print("\"" + keyname + "\":", "\"" + str(out[fullkeyname]) + "\",") elif len(tables[table][key]) == 1: out[fullkeyname] = convert_to_number(tables[table][key][0]) - print("\"" + keyname + "\":", "\"" + str(out[fullkeyname]) + "\",") + #print("\"" + keyname + "\":", "\"" + str(out[fullkeyname]) + "\",") - print("}") + # if the item has at least two commas in it, split it + if tables[table][key].count(',') > 0: + out[fullkeyname] = list(map(lambda x: x.strip(), tables[table][key].split(","))) + #print("\"" + keyname + "\":", "\"" + str(out[fullkeyname]) + "\",") + + + #print("}") return out diff --git a/run.py b/run.py index 7229243..d00a621 100755 --- a/run.py +++ b/run.py @@ -139,6 +139,8 @@ def start_server_socket(): # TODO Helper for converting Python Dictionaries to JSON # make function: pythonData --> { { "type": "...", "call": "...", "data": pythonData } } + + # to send: to_server_queue.put(("*", "JSON STRING HERE")) # replace * with UUID of client to send to one specific location case "cable_details": fprint("cable_details message") diff --git a/source.fish b/source.fish new file mode 100644 index 0000000..6b99f46 --- /dev/null +++ b/source.fish @@ -0,0 +1 @@ +source venv/bin/activate.fish diff --git a/source.sh b/source.sh new file mode 100644 index 0000000..619fe07 --- /dev/null +++ b/source.sh @@ -0,0 +1 @@ +source venv/bin/activate diff --git a/test.py b/test.py new file mode 100644 index 0000000..8762c31 --- /dev/null +++ b/test.py @@ -0,0 +1,106 @@ +print("\u001b[37m") + +class Ring: + def __init__(self) -> None: + self.leds = [0] * 24 + self.id = 0 + self.dirty = False + + def __iter__(self) -> iter: + yield from self.leds + + def __repr__(self) -> str: + return f"Ring" + + def __add__(self, other): + self.leds.extend(other) + return self + + def __bool__(self): + return self.dirty + + def __getitem__(self, index): + return self.leds[index] + + def __setitem__(self, index, value): + ivalue = self.leds[index] + if ivalue != value: + self.dirty = True + self.leds[index] = value + + def __getattr__(self, name): + import word2num + name = int(word2num.word2num(name)) + print(name) + if 0 <= name < len(self.leds): + return self.leds[name] + + + +a = Ring() +print(a) +b = Ring() +b.leds[2] = 3 + +print(a + b) + +b.active = True + +if b: + print("Bexist") + +c = [a, b, b, a, a] + +d = list(filter(lambda x: bool(x), c)) + +print(d) + +for i, ring in enumerate(c): + ring[0] = i + print(ring) + +print(a, b) + +print(f"\u001b[32m{a}") +print(f"\u001b[37ma") + +print(getattr(a, "twenty two")) + +# eval(f"getattr(a,\"{input()}\")") + + +# a = r"wow this string is cursed; for example \n" + + +# SEARCHDATA=r"""{ "q": "{QUERY}", "sortCriteria": "relevancy", "numberOfResults": "250", "sortCriteria": "@catalogitemwebdisplaypriority ascending", "searchHub": "products-only-search", "pipeline": "Site Search", "maximumAge": "900000", "tab": "products-search", "locale": "en", "aq": "(NOT @z95xtemplate==(ADB6CA4F03EF4F47B9AC9CE2BA53FF97,FE5DD82648C6436DB87A7C4210C7413B)) ((@syssource==\"website_001002_catalog_index-rg-nc-prod-sitecore-prod\" @catalogitemprimarycategorypublished==true)) ((@catalogitemregionavailable=Global) (@z95xlanguage==en))", "cq": "((@z95xlanguage==en) (@z95xlatestversion==1) (@source==\"Coveo_web_index - rg-nc-prod-sitecore-prod\")) OR (@source==(\"website_001002_catalog_index-rg-nc-prod-sitecore-prod\",\"website_001002_Category_index-rg-nc-prod-sitecore-prod\"))", "firstResult": "0" }, "categoryFacets": "[{\"field\":\"@catalogitemcategories\",\"path\":[],\"injectionDepth\":1000,\"maximumNumberOfValues\":6,\"delimitingCharacter\":\"|\"}]", "facetOptions": "{}", "groupBy": " [{\"field\":\"@contenttype\",\"maximumNumberOfValues\":6,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[\"Products\"],\"queryOverride\":\"{QUERY}\",\"advancedQueryOverride\":\"(NOT @z95xtemplate==(ADB6CA4F03EF4F47B9AC9CE2BA53FF97,FE5DD82648C6436DB87A7C4210C7413B)) ((((((((@z95xpath=3324AF2D58F64C0FB725521052F679D2 @z95xid<>3324AF2D58F64C0FB725521052F679D2) ((@z95xpath=C292F3A37B3A4E6BAB345DF87ADDE516 @z95xid<>C292F3A37B3A4E6BAB345DF87ADDE516) @z95xtemplate==E4EFEB787BDC4B1A908EFC64D56CB2A4)) OR ((@z95xpath=723501A864754FEEB8AE377E4C710271 @z95xid<>723501A864754FEEB8AE377E4C710271) ((@z95xpath=600114EAB0E5407A84AAA9F0985B6575 @z95xid<>600114EAB0E5407A84AAA9F0985B6575) @z95xtemplate==2BE4FD6B3B2C49EBBD9E1F6C92238B05))) OR (@syssource==\\"website_001002_catalog_index-rg-nc-prod-sitecore-prod\\" @catalogitemprimarycategorypublished==true)) OR ((@z95xpath=3324AF2D58F64C0FB725521052F679D2 @z95xid<>3324AF2D58F64C0FB725521052F679D2) @z95xpath<>C292F3A37B3A4E6BAB345DF87ADDE516)) OR @syssource==\\"website_001002_Category_index-rg-nc-prod-sitecore-prod\\") NOT @z95xtemplate==(ADB6CA4F03EF4F47B9AC9CE2BA53FF97,FE5DD82648C6436DB87A7C4210C7413B))) ((@catalogitemregionavailable=Global) (@z95xlanguage==en) OR (@contenttype=(Blogs,Resources,Other)) (NOT @ez120xcludefromcoveo==1))\",\"constantQueryOverride\":\"((@z95xlanguage==en) (@z95xlatestversion==1) (@source==\\"Coveo_web_index - rg-nc-prod-sitecore-prod\\")) OR (@source==(\\"website_001002_catalog_index-rg-nc-prod-sitecore-prod\\",\\"website_001002_Category_index-rg-nc-prod-sitecore-prod\\"))\"},{\"field\":\"@catalogitembrand\",\"maximumNumberOfValues\":6,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@catalogitemenvironment\",\"maximumNumberOfValues\":6,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@catalogitemregionalavailability\",\"maximumNumberOfValues\":6,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@prez45xtez120xt\",\"maximumNumberOfValues\":5,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@tags\",\"maximumNumberOfValues\":4,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@facetassettype\",\"maximumNumberOfValues\":3,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@facetbrand\",\"maximumNumberOfValues\":3,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@facetmarket\",\"maximumNumberOfValues\":6,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@facetsolution\",\"maximumNumberOfValues\":6,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]},{\"field\":\"@facetsearchcontentpagetype\",\"maximumNumberOfValues\":6,\"sortCriteria\":\"occurrences\",\"injectionDepth\":1000,\"completeFacetWithStandardValues\":true,\"allowedValues\":[]}]" }""" + +# QUERY = "AAAAAAAAAAAA" + +# b = SEARCHDATA.replace(r"{QUERY}", QUERY) + +q = [i * 2 for i in range(10)] + +d = {a : b for a,b in enumerate(q)} + +print(q) + +print(d) + +def stalin_sort(a): + b = sum(a) + b /= len(a) + return [b for _ in range(len(a))] + +def mao_sort(a): + i = 0 + while i < len(a) - 1: + if a[i+1] < a[i]: + del a[i] + else: + i += 1 + return a + +print(stalin_sort(list(range(10)))) +print(mao_sort([1, 3, 2, 4, 5, 8, 7, 6, 9])) + +# i l \ No newline at end of file