Created
July 8, 2013 18:33
-
-
Save LordSputnik/5951292 to your computer and use it in GitHub Desktop.
Example of responding to a data request using a fixed template.
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
from collections import defaultdict | |
import copy | |
import json | |
simulated_release = { | |
"artist":"The Beatles", | |
"title":"Collection of Random Hits", | |
"mbid":3, | |
} | |
simulated_recordings = [ | |
{ | |
"artist":"The Beatles", | |
"title":"Get Back", | |
"length":20386, | |
"mbid":1, | |
"release":3 | |
}, | |
{ | |
"artist":"The Beatles", | |
"title":"Hey Jude", | |
"length":20385, | |
"mbid":2, | |
"release":3 | |
} | |
] | |
class ReleaseTemplate(): | |
def __init__(self, template): | |
self.template = template | |
self.saved_template = copy.deepcopy(self.template) | |
self.data = {} | |
self.keywords = { | |
"recordings":self.recording, | |
} | |
self.requested = defaultdict(list) | |
self.request_mbid = None | |
def process_template(self,data = None): | |
for k,v in self.template.iteritems(): | |
self.process_part(self.template,k) | |
def process_part(self, parent, key): | |
value = parent[key] | |
if type(value) is dict: | |
for k,v in value.iteritems(): | |
self.process_part(value,k) | |
else: | |
parent[key] = self.keywords[key]() | |
def recording(self): | |
if self.data is not None: | |
self.recordings = [r['mbid'] for r in simulated_recordings if r['release'] == self.request_mbid] | |
temp = RecordingTemplate(self.saved_template['release']['recordings'][0]) | |
temp.process_template() | |
result = [] | |
for r in self.recordings: | |
result.append(temp.get_data(r)) | |
return result | |
else: | |
return None | |
def get_data(self, mbid): | |
self.request_mbid = mbid | |
for db, params in self.requested.iteritems(): | |
#Query db for params | |
self.data[db] = [r for r in simulated_recordings if r['mbid'] == mbid][0] | |
for k,v in self.template.iteritems(): | |
self.process_part(self.template,k) | |
return self.template | |
class RecordingTemplate(): | |
def __init__(self, template): | |
self.template = template | |
self.saved_template = copy.deepcopy(self.template) | |
self.data = {} | |
self.keywords = { | |
"title":self.title, | |
"artist":self.artist, | |
"length":self.length | |
} | |
self.requested = defaultdict(list) | |
self.request_mbid = None | |
def process_part(self, parent, key): | |
value = parent[key] | |
if type(value) is dict: | |
for k,v in value.iteritems(): | |
self.process_part(value,k) | |
else: | |
parent[key] = self.keywords[key]() | |
def get_data(self, mbid): | |
self.request_mbid = mbid | |
for db, params in self.requested.iteritems(): | |
#Query db for params | |
self.data[db] = [r for r in simulated_recordings if r['mbid'] == mbid][0] | |
for k,v in self.template.iteritems(): | |
self.process_part(self.template,k) | |
return copy.deepcopy(self.template) | |
def process_template(self,data = None): | |
for k,v in self.template.iteritems(): | |
self.process_part(self.template,k) | |
def title(self): | |
if not self.data: | |
self.requested['recording'].append('title') | |
return None | |
else: | |
return self.data['recording']['title'] | |
def artist(self): | |
if not self.data: | |
self.requested['recording'].append('artist') | |
return None | |
else: | |
return self.data['recording']['artist'] | |
def length(self): | |
if not self.data: | |
self.requested['recording'].append('length') | |
return None | |
else: | |
return self.data['recording']['length'] | |
template = { | |
"release": { | |
"recordings": | |
[{ | |
"artist" : None, | |
"length" : None | |
},] | |
} | |
} | |
my_template = ReleaseTemplate(template) | |
my_template.process_template() | |
print json.dumps(my_template.get_data(3), sort_keys=True, indent=4, separators=(',', ': ')) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
P.S. Try editing the template to add "title": None, between "artist": None, and "length": None to see why this is useful.