add jsonencode(), 0.2.1

This commit is contained in:
Yusur 2025-05-27 12:21:22 +02:00
parent 82b688fe86
commit 7802ac2367
3 changed files with 26 additions and 4 deletions

View file

@ -1,5 +1,8 @@
# Changelog
## 0.2.1
- Add `codecs.jsonencode`
## 0.2.0

View file

@ -17,7 +17,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
"""
from .iding import Siq, SiqCache, SiqType, SiqGen
from .codecs import StringCase, cb32encode, cb32decode
from .codecs import StringCase, cb32encode, cb32decode, jsonencode
from .bits import count_ones, mask_shift
from .configparse import MissingConfigError, MissingConfigWarning, ConfigOptions, ConfigParserConfigSource, ConfigSource, DictConfigSource, ConfigValue, EnvConfigSource
from .functools import deprecated, not_implemented
@ -25,11 +25,11 @@ from .classtools import Wanted, Incomplete
from .itertools import makelist, kwargs_prefix
from .i18n import I18n, JsonI18n, TomlI18n
__version__ = "0.2.0"
__version__ = "0.2.1"
__all__ = (
'Siq', 'SiqCache', 'SiqType', 'SiqGen', 'StringCase',
'MissingConfigError', 'MissingConfigWarning', 'ConfigOptions', 'ConfigParserConfigSource', 'ConfigSource', 'ConfigValue', 'EnvConfigSource', 'DictConfigSource',
'deprecated', 'not_implemented', 'Wanted', 'Incomplete',
'deprecated', 'not_implemented', 'Wanted', 'Incomplete', 'jsonencode'
'makelist', 'kwargs_prefix', 'I18n', 'JsonI18n', 'TomlI18n', 'cb32encode', 'cb32decode', 'count_ones', 'mask_shift'
)

View file

@ -15,8 +15,11 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
"""
import base64
import datetime
import enum
import json
import re
from typing import Any, Callable
from suou.functools import not_implemented
@ -74,6 +77,22 @@ def b64decode(val: bytes | str) -> bytes:
val = val.encode('ascii')
return base64.urlsafe_b64decode(val.replace(b'/', b'_').replace(b'+', b'-') + b'=' * ((4 - len(val) % 4) % 4))
def _json_default(func = None) -> Callable[Any, str | list | dict]:
def default_converter(obj: Any) -> str | list | dict:
if isinstance(obj, (datetime.datetime, datetime.date)):
return obj.isoformat()
elif callable(func):
return func(obj)
else:
raise TypeError
return default_converter
def jsonencode(obj: dict, *, skipkeys: bool = True, separators: tuple[str, str] = (',', ':'), default: Callable | None = None, **kwargs) -> str:
'''
JSON encoder with stricter and smarter defaults.
'''
return json.dumps(obj, skipkeys=skipkeys, separators=separators, default=_json_default(default), **kwargs)
class StringCase(enum.Enum):
"""
Enum values used by regex validators and storage converters.
@ -108,6 +127,6 @@ class StringCase(enum.Enum):
__all__ = (
'cb32encode', 'cb32decode', 'b32lencode', 'b32ldecode', 'b64encode', 'b64decode',
'cb32encode', 'cb32decode', 'b32lencode', 'b32ldecode', 'b64encode', 'b64decode', 'jsonencode'
'StringCase'
)