Source code for gron.gron

"""Gron's core functions.

"""

# remove when we don't support py38 anymore
from __future__ import annotations
import json
from typing import Any


[docs]def walk(node: Any, name: str) -> str: """Translate Python element to JSON. This method recursively visits each element of a Python object and returns the JSON representation. Parameters ---------- node A python object (e.g. dict, list, int, etc) name The name (i.e. path) of the parent element Returns ------- str Transformed JSON for this element """ if node is None: return f"{name} = null;" elif isinstance(node, bool): return f"{name} = {str(node).lower()};" elif isinstance(node, str): return f'{name} = "{node}";' elif isinstance(node, bytes): return f'{name} = "{node!r}";' elif isinstance(node, dict): res = [] res.append(f"{name} = {{}};") for k, v in sorted(node.items()): res.append(walk(v, name + convert('.' + k))) return '\n'.join(sorted(res)) elif isinstance(node, (list, tuple)): res = [] res.append(f"{name} = [];") for i, e in enumerate(node): res.append(walk(e, name + convert(str([i])))) return '\n'.join(res) else: return f"{name} = {node!r};"
[docs]def convert(name: str) -> str: """Convert path name into valid JSON. Parameters ---------- name a path name Returns ------- str valid JSON path """ if '-' in name or ' ' in name: return '["{}"]'.format(name[1:]) return name
[docs]def gron(input_: str) -> str: """Transform JSON into parseable str. This method takes a JSON string and transforms it into a grepable equivalent form. Parameters ---------- input_ JSON Returns ------- str Transformed output """ python = json.loads(input_) output = walk(python, 'json') return output