armyknife of handling dict object
Python
Latest commit 5de465b Feb 12, 2017 podhmo 0.3.2
Permalink
Failed to load latest commit information.
dictknife too normalized Feb 12, 2017
examples change transform command Jan 8, 2017
.gitignore scaffold Dec 16, 2016
.travis.yml travis Dec 17, 2016
CHANGES.txt readme Jan 8, 2017
README.rst diff function Feb 2, 2017
setup.cfg scaffold Dec 16, 2016
setup.py 0.3.2 Feb 12, 2017

README.rst

dictknife

https://travis-ci.org/podhmo/dictknife.svg?branch=master

features

  • deepmerge
  • deepequal
  • walker
  • diff

deepmerge

from dictknife import deepmerge
d0 = {
    "a": {
        "x": 1
    },
    "b": {
        "y": 10
    },
}
d1 = {
    "a": {
        "x": 1
    },
    "b": {
        "z": 10
    },
    "c": 100
}
actual = self._callFUT(d0, d1)
expected = {
    "a": {
        "x": 1
    },
    "b": {
        "y": 10,
        "z": 10
    },
    "c": 100
}
assert actual == expected

walker

using LooseDictWalkingIterator example.

import json
import pprint
from dictknife import LooseDictWalkingIterator

# from: https://github.com/BigstickCarpet/json-schema-ref-parser
d = json.loads("""
{
  "definitions": {
    "person": {
      "$ref": "schemas/people/Bruce-Wayne.json"
    },
    "place": {
      "$ref": "schemas/places.yaml#/definitions/Gotham-City"
    },
    "thing": {
      "$ref": "http://wayne-enterprises.com/things/batmobile"
    },
    "color": {
      "$ref": "#/definitions/thing/properties/colors/black-as-the-night"
    }
  }
}
""")

refs = []

iterator = LooseDictWalkingIterator(["$ref"])
for path, sd in iterator.iterate(d):
    refs.append((path[:], sd["$ref"]))

pprint.pprint(refs)

output

[(['definitions', 'color', '$ref'],
  '#/definitions/thing/properties/colors/black-as-the-night'),
 (['definitions', 'place', '$ref'],
  'schemas/places.yaml#/definitions/Gotham-City'),
 (['definitions', 'thing', '$ref'],
  'http://wayne-enterprises.com/things/batmobile'),
 (['definitions', 'person', '$ref'], 'schemas/people/Bruce-Wayne.json')]

todo: description about chains and operator and context,...

command

install dictknife via pip install dictknife[command] .

  • concat
  • transform
  • diff

TODO: gentle introduction

concat

$ dicknife concat a.yaml b.yaml c.json

transform

$ dicknife transform --function misc/transform.py:lift --src src/01transform/properties.yaml --config '{"name": "person"}'
# or
$ dictknife transform --code 'lambda d,**kwargs: {"definitions": {"person": d}}' --src src/01transform/properties.yaml

diff

$ dictknife diff a.yaml b.yaml
$ dictknife diff --sort-keys a.yaml b.yaml
--- src/02diff/left.yaml
+++ src/02diff/right.json
@@ -1,13 +1,12 @@
 {
-  "Person": {
+  "person": {
     "properties": {
-      "Name": {
+      "name": {
         "type": "string",
-        "description": "someone's name"
+        "description": "Someone's name"
       },
-      "Age": {
-        "type": "integer",
-        "description": "age"
+      "age": {
+        "type": "integer"
       }
     }
   }