Skip to content

Instantly share code, notes, and snippets.

@LordSputnik
Created July 8, 2013 18:33
Show Gist options
  • Save LordSputnik/5951292 to your computer and use it in GitHub Desktop.
Save LordSputnik/5951292 to your computer and use it in GitHub Desktop.
Example of responding to a data request using a fixed template.
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=(',', ': '))
@LordSputnik
Copy link
Author

P.S. Try editing the template to add "title": None, between "artist": None, and "length": None to see why this is useful.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment