X-Git-Url: https://git.frykholm.com/friends.git/blobdiff_plain/ddf4123ddc9df1b3786c3950f0bed371d8bba352..511b6ecb108d9a00340f1e58b849c3fcdb4536c9:/friends/rd/jrd.py diff --git a/friends/rd/jrd.py b/friends/rd/jrd.py new file mode 100644 index 0000000..4dda5b5 --- /dev/null +++ b/friends/rd/jrd.py @@ -0,0 +1,146 @@ + +import json +import isodate + +from rd.core import RD, Attribute, Element, Link, Property, Title + + +def _clean_dict(d): + for key in list(d.keys()): + if not d[key]: + del d[key] + + +def loads(content): + + def expires_handler(key, val, obj): + obj.expires = isodate.parse_datetime(val) + + def subject_handler(key, val, obj): + obj.subject = val + + def aliases_handler(key, val, obj): + for alias in val: + obj.aliases.append(alias) + + def properties_handler(key, val, obj): + for ptype, pvalue in list(val.items()): + obj.properties.append(Property(ptype, pvalue)) + + def titles_handler(key, val, obj): + for tlang, tvalue in list(val.items()): + if tlang == 'default': + tlang = None + obj.titles.append(Title(tvalue, tlang)) + + def links_handler(key, val, obj): + for link in val: + l = Link() + l.rel = link.get('rel', None) + l.type = link.get('type', None) + l.href = link.get('href', None) + l.template = link.get('template', None) + if 'titles' in link: + titles_handler('title', link['titles'], l) + if 'properties' in link: + properties_handler('property', link['properties'], l) + obj.links.append(l) + + def namespace_handler(key, val, obj): + for namespace in val: + ns = list(namespace.keys())[0] + ns_uri = list(namespace.values())[0] + obj.attributes.append(Attribute("xmlns:%s" % ns, ns_uri)) + + handlers = { + 'expires': expires_handler, + 'subject': subject_handler, + 'aliases': aliases_handler, + 'properties': properties_handler, + 'links': links_handler, + 'titles': titles_handler, + 'namespace': namespace_handler, + } + + def unknown_handler(key, val, obj): + if ':' in key: + (ns, name) = key.split(':') + key = "%s:%s" % (ns, name.capitalize()) + obj.elements.append(Element(key, val)) + + doc = json.loads(content) + + rd = RD() + + for key, value in list(doc.items()): + handler = handlers.get(key, unknown_handler) + handler(key, value, rd) + + return rd + + +def dumps(xrd): + + doc = { + "aliases": [], + "links": [], + "namespace": [], + "properties": {}, + "titles": [], + } + + #list_keys = doc.keys() + + for attr in xrd.attributes: + if attr.name.startswith("xmlns:"): + ns = attr.name.split(":")[1] + doc['namespace'].append({ns: attr.value}) + + if xrd.expires: + doc['expires'] = xrd.expires.isoformat() + + if xrd.subject: + doc['subject'] = xrd.subject + + for alias in xrd.aliases: + doc['aliases'].append(alias) + + for prop in xrd.properties: + doc['properties'][prop.type] = prop.value + + for link in xrd.links: + + link_doc = { + 'titles': {}, + 'properties': {}, + } + + if link.rel: + link_doc['rel'] = link.rel + + if link.type: + link_doc['type'] = link.type + + if link.href: + link_doc['href'] = link.href + + if link.template: + link_doc['template'] = link.template + + for prop in link.properties: + link_doc['properties'][prop.type] = prop.value + + for title in link.titles: + lang = title.lang or "default" + link_doc['titles'][lang] = title.value + + _clean_dict(link_doc) + + doc['links'].append(link_doc) + + for elem in xrd.elements: + doc[elem.name.lower()] = elem.value + + _clean_dict(doc) + + return json.dumps(doc)