dictremapper
dictremapper is remapping dict library
- ordered (important)
- support inheritance (of mapper)
- support nested structure
- (excludes option of each layer)
simple example
import requests
import json
from dictremapper import Remapper, Path
class SummaryRemapper(Remapper):
fullname = Path("full_name")
url = Path("html_url")
description = Path("description")
url = "https://api.github.com/repos/podhmo/dictremapper"
data = requests.get(url).json()
data = SummaryRemapper()(data)
print(json.dumps(data, indent=2))
output
{ "fullname": "podhmo/dictremapper", "url": "https://github.com/podhmo/dictremapper", "description": "remapping dict" }
support inheritance (of mapper)
from dictremapper import Remapper, Path
class URLRemapper(Remapper):
url = Path("html_url")
class DescriptionRemapper(Remapper):
fullname = Path("full_name")
description = Path("description")
class SummaryRemapper(URLRemapper, DescriptionRemapper):
star = Path("stargazers_count")
url = "https://api.github.com/repos/podhmo/dictremapper"
data = requests.get(url).json()
remapped = SummaryRemapper()(data)
print(json.dumps(remapped, indent=2))
output
{ "url": "https://github.com/podhmo/dictremapper", "fullname": "podhmo/dictremapper", "description": "remapping dict", "star": 0 }
If you want to change order. ChangeOrder is helpful, maybe.
from dictremapper import ChangeOrder
class SummaryRemapper2(URLRemapper, DescriptionRemapper):
url = ChangeOrder(URLRemapper.url)
description = ChangeOrder(DescriptionRemapper.description)
star = Path("stargazers_count")
remapped = SummaryRemapper2()(data)
print(json.dumps(remapped, indent=2))
output
{ "fullname": "podhmo/dictremapper", "url": "https://github.com/podhmo/dictremapper", "description": "remapping dict", "star": 0 }
support nested structure
class MyMapper3(Remapper):
body = Path("body", callback=MyMapper())
children = Path("children", callback=MyMapper2(many=True))
excludes option of each layer
class MyMapper3(Remapper):
body = Path("body", callback=MyMapper())
children = Path("children", callback=MyMapper2(many=True, excludes=["object.name", "object.age", "id"]))
MyMapper3(excludes=["children.object.description", "body"])(d)