Source code for coalib.output.JSONEncoder

import collections
import json
import re
from datetime import datetime

from coala_utils.decorators import get_public_members
from coalib.settings.FunctionMetadata import FunctionMetadata


[docs]def create_json_encoder(**kwargs): class JSONEncoder(json.JSONEncoder): @classmethod def _filter_params(cls, op, nop): params = set(op) | set(nop) return {key: kwargs[key] for key in set(kwargs) & (params)} def default(self, obj): if hasattr(obj, '__json__'): fdata = FunctionMetadata.from_function(obj.__json__) params = self._filter_params( fdata.optional_params, fdata.non_optional_params) return obj.__json__(**params) elif isinstance(obj, collections.Iterable): return list(obj) elif isinstance(obj, datetime): return obj.isoformat() elif hasattr(obj, '__getitem__') and hasattr(obj, 'keys'): return dict(obj) elif hasattr(obj, '__dict__'): return {member: getattr(obj, member) for member in get_public_members(obj)} elif isinstance(obj, re._pattern_type): return obj.pattern return json.JSONEncoder.default(self, obj) return JSONEncoder