Created
May 3, 2014 22:29
-
-
Save wiiaboo/11507232 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 1. "get information from google" | |
# 2. "parse json/xml" | |
# 3. "loop by tier" | |
# 4. "loop by component" | |
# 5. "split by name and link" | |
# --- | |
# Get data from Google Docs, parse the data, split by tier, each tier by components, | |
# get a component and its name and link. | |
from xml.dom import minidom | |
from urllib.request import urlopen | |
COMPONENTS = ['gpu', 'cpu', 'hsf', 'mobo', | |
'ram', 'hdd', 'ssd', 'psu', 'case'] | |
TIERS = ['Destitute', 'Poor', 'Minimum', 'Entry', 'Modest', | |
'Fair', 'Good', 'Very good', 'Great', 'Suberb', | |
'Excellent', 'Outstanding', 'Exceptional', 'Enthusiast', | |
'Extremist', 'Monstrous'] | |
def get_text(parent, tagname): | |
elements = parent.getElementsByTagName(tagname) | |
if len(elements) != 0: | |
element = elements[0] | |
if element.hasChildNodes(): | |
return element.childNodes[0].data | |
else: | |
return "" | |
else: | |
return "" | |
class Component(object): | |
def __init__(self, _type, name, price, link, tier=""): | |
self.type = _type | |
self.name = name | |
self.price = round(float(price) + 0.2) | |
self.link = link | |
self.tier = tier | |
def __eq__(self, other): | |
return (self.type == other.type and self.name == other.name and | |
self.price == other.price and self.link == other.link) | |
def __repr__(self): | |
return 'Component(name={!r})'.format(self.name) | |
class Tier(object): | |
def __init__(self, name): | |
self.name = name | |
self.component_list = [] | |
def __contains__(self, other): | |
if other in self.component_list: | |
return True | |
else: | |
return False | |
def __eq__(self, other): | |
return self.name == other.name | |
def __repr__(self): | |
return 'Tier(name={!r})'.format(self.name) | |
def add(self, component): | |
if component not in self.component_list or component.name != "": | |
component.tier = self.name | |
self.component_list.append(component) | |
def get(self, _type): | |
result = [] | |
for component in component_list: | |
if component.type == _type: | |
result.append(component) | |
else: | |
continue | |
return result | |
def get_all(self): | |
return self.component_list | |
def from_entry(self, entry): | |
for component in COMPONENTS: | |
name = get_text(entry, 'gsx:' + component) | |
price = 0 | |
link = "" | |
if name not in ["", "Stock", "None"]: | |
price = get_text(entry, 'gsx:' + component + 'price') | |
link = get_text(entry, 'gsx:' + component + 'link') | |
self.add(Component(component, name, price, link, self.name)) | |
else: | |
continue | |
class Table(object): | |
def __init__(self, entries): | |
self.tiers = {} | |
prev = "" | |
for entry in entries: | |
name = get_text(entry, 'gsx:tier') | |
if name == "": | |
tier = self.tiers[prev] | |
else: | |
tier = Tier(name) | |
tier.from_entry(entry) | |
self.tiers[tier.name] = tier | |
prev = tier.name | |
def __getitem__(self, tier): | |
return self.tiers[tier] | |
def __repr__(self): | |
return 'Tiers: {!r}'.format(TIERS) | |
def get_entries(sheet): | |
# convert to text | |
xmldoc = minidom.parse(sheet) | |
entries = xmldoc.getElementsByTagName('entry') | |
return entries | |
sheet_url = "https://spreadsheets.google.com/feeds/list/1eI_N4YWuQRR3fCasrU7w9lDMPo15ayVL-MV40sE794g/od6/public/values" | |
# sheet_text = urlopen(sheet_url) | |
sheet_text = "values.xht" | |
entries = get_entries(sheet_text) | |
sheet = Table(entries) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment