Skip to content

Support encoding any Enum value type #680

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Closed
nhairs opened this issue May 7, 2024 · 0 comments · Fixed by #757
Closed

Support encoding any Enum value type #680

nhairs opened this issue May 7, 2024 · 0 comments · Fixed by #757

Comments

@nhairs
Copy link

nhairs commented May 7, 2024

Description

Currently msgspec only supports encoding Enum values that strings or integers, throwing msgspec.EncodeError: Only enums with int or str values are supported when attempting to encode anything else.

As far as I can tell this affects the following encoders:

  • msgpack (have not tested, only from reading source code)
  • json (have tested)

It feels like any value supported by the encoder should be encoded rather than just these two specific types.

Alternatively, in the case of the JSON encoder (I haven't checked the other encoders), it should be possible to use the enc_hook to handle the other types. Currently this is not possible as the error is thrown before the enc_hook is called.

The specific use case that I'm hitting this on is in adding support for the msgspec encoder to python-json-logger (nhairs/python-json-logger#12)

>>> import msgspec.json
>>> e = msgspec.json.Encoder()
>>> import enum
>>> class SomeEnum(enum.Enum):
...  NULL = None
... 
>>> e.encode(SomeEnum.NULL)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
msgspec.EncodeError: Only enums with int or str values are supported
gcf-merge-on-green bot pushed a commit to GoogleCloudPlatform/microservices-demo that referenced this issue Mar 17, 2025
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [python-json-logger](https://github.com/nhairs/python-json-logger) | `==3.2.1` -> `==3.3.0` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/python-json-logger/3.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/python-json-logger/3.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/python-json-logger/2.0.7/3.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/python-json-logger/2.0.7/3.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>nhairs/python-json-logger (python-json-logger)</summary>

### [`v3.3.0`](https://github.com/nhairs/python-json-logger/releases/tag/v3.3.0): 3.3.0

[Compare Source](https://github.com/nhairs/python-json-logger/compare/v3.2.1...v3.3.0)

##### Added

-   `exc_info_as_array` and `stack_info_as_array` options are added to `pythonjsonlogger.core.BaseJsonFormatter` allowing both to be encoded as list of lines instead of a single multi-line string. [#&#8203;35](https://github.com/nhairs/python-json-logger/issues/35)

##### Security

-   Remove `msgspec-python313-pre` from `dev` dependencies preventing potential RCE. Details: [GHSA-wmxh-pxcx-9w24](https://github.com/nhairs/python-json-logger/security/advisories/GHSA-wmxh-pxcx-9w24#advisory-comment-121307)

Thanks [@&#8203;1hakusai1](https://github.com/1hakusai1) and [@&#8203;omnigodz](https://github.com/omnigodz)

### [`v3.2.1`](https://github.com/nhairs/python-json-logger/releases/tag/v3.2.1): 3.2.1

[Compare Source](https://github.com/nhairs/python-json-logger/compare/v3.2.0...v3.2.1)

##### Fixed

-   Import error on `import pythonjsonlogger.jsonlogger` [#&#8203;29](https://github.com/nhairs/python-json-logger/issues/29)

### [`v3.2.0`](https://github.com/nhairs/python-json-logger/releases/tag/v3.2.0): 3.2.0

[Compare Source](https://github.com/nhairs/python-json-logger/compare/v3.1.0...v3.2.0)

##### Changed

-   `pythonjsonlogger.[ORJSON,MSGSPEC]_AVAILABLE` no longer imports the respective package when determining availability.
-   `pythonjsonlogger.[orjson,msgspec]` now throws a `pythonjsonlogger.exception.MissingPackageError` when required libraries are not available. These contain more information about what is missing whilst still being an `ImportError`.
-   `defaults` parameter is no longer ignored and now conforms to the standard library. Setting a defaults dictionary will add the specified keys if the those keys do not exist in a record or weren't passed by the `extra` parameter when logging a message.
-   `typing_extensions` is only installed on Python version < 3.10.
-   Support Python 3.13
    -   `msgspec` has only been tested against pre-release versions.

Thanks [@&#8203;cjwatson](https://github.com/cjwatson) and [@&#8203;bharel](https://github.com/bharel)

### [`v3.1.0`](https://github.com/nhairs/python-json-logger/releases/tag/v3.1.0)

[Compare Source](https://github.com/nhairs/python-json-logger/compare/v3.0.1...v3.1.0)

This splits common funcitonality out to allow supporting other JSON encoders. Although this is a large refactor, backwards compatibility has been maintained.

##### Added

-   `pythonjsonlogger.core` - more details below.
-   `pythonjsonlogger.defaults` module that provides many functions for handling unsupported types.
-   Orjson encoder support via `pythonjsonlogger.orjson.OrjsonFormatter` with the following additions:
    -   bytes are URL safe base64 encoded.
    -   Exceptions are "pretty printed" using the exception name and message e.g. `"ValueError: bad value passed"`
    -   Enum values use their value, Enum classes now return all values as a list.
    -   Tracebacks are supported
    -   Classes (aka types) are support
    -   Will fallback on `__str__` if available, else `__repr__` if available, else will use `__could_not_encode__`
-   MsgSpec encoder support via `pythonjsonlogger.msgspec.MsgspecFormatter` with the following additions:
    -   Exceptions are "pretty printed" using the exception name and message e.g. `"ValueError: bad value passed"`
    -   Enum classes now return all values as a list.
    -   Tracebacks are supported
    -   Classes (aka types) are support
    -   Will fallback on `__str__` if available, else `__repr__` if available, else will use `__could_not_encode__`
    -   Note: msgspec only supprts enum values of type `int` or `str` [jcrist/msgspec#680](https://github.com/jcrist/msgspec/issues/680)

##### Changed

-   `pythonjsonlogger.jsonlogger` has been moved to `pythonjsonlogger.json` with core functionality moved to `pythonjsonlogger.core`.
-   `pythonjsonlogger.core.BaseJsonFormatter` properly supports all `logging.Formatter` arguments:
    -   `fmt` is unchanged.
    -   `datefmt` is unchanged.
    -   `style` can now support non-standard arguments by setting `validate` to `False`
    -   `validate` allows non-standard `style` arguments or prevents calling `validate` on standard `style` arguments.
    -   `default` is ignored.
-   `pythonjsonlogger.json.JsonFormatter` default encodings changed:
    -   bytes are URL safe base64 encoded.
    -   Exception formatting detected using `BaseException` instead of `Exception`. Now "pretty prints" the exception using the exception name and message e.g. `"ValueError: bad value passed"`
    -   Dataclasses are now supported
    -   Enum values now use their value, Enum classes now return all values as a list.
    -   Will fallback on `__str__` if available, else `__repr__` if available, else will use `__could_not_encode__`
-   Renaming fields now preserves order ([#&#8203;7](https://github.com/nhairs/python-json-logger/issues/7)) and ignores missing fields ([#&#8203;6](https://github.com/nhairs/python-json-logger/issues/6)).
-   Documentation
    -   Generated documentation using `mkdocs` is stored in `docs/`
    -   Documentation within `README.md` has been moved to `docs/index.md` and `docs/qucikstart.md`.
    -   `CHANGELOG.md` has been moved to `docs/change-log.md`
    -   `SECURITY.md` has been moved and replaced with a symbolic link to `docs/security.md`.

##### Deprecated

-   `pythonjsonlogger.jsonlogger` is now `pythonjsonlogger.json`
-   `pythonjsonlogger.jsonlogger.RESERVED_ATTRS` is now `pythonjsonlogger.core.RESERVED_ATTRS`.
-   `pythonjsonlogger.jsonlogger.merge_record_extra` is now `pythonjsonlogger.core.merge_record_extra`.

##### Removed

-   Python 3.7 support dropped
-   `pythonjsonlogger.jsonlogger.JsonFormatter._str_to_fn` replaced with `pythonjsonlogger.core.str_to_object`.

### [`v3.0.1`](https://github.com/nhairs/python-json-logger/releases/tag/v3.0.1)

[Compare Source](https://github.com/nhairs/python-json-logger/compare/v3.0.0...v3.0.1)

##### Fixes

-   Fix spelling of parameter `json_serialiser` -> `json_serializer` ([#&#8203;8](https://github.com/nhairs/python-json-logger/issues/8)) - [@&#8203;juliangilbey](https://github.com/juliangilbey)

### [`v3.0.0`](https://github.com/nhairs/python-json-logger/releases/tag/v3.0.0)

[Compare Source](https://github.com/nhairs/python-json-logger/compare/v2.0.7...v3.0.0)

Note: using new major version to separate changes from this fork and the original (upstream). See [#&#8203;1](https://github.com/nhairs/python-json-logger/issues/1) for details.

##### Changes

-   Update supported Python versions - [@&#8203;nhairs](https://github.com/nhairs)
    -   Drop 3.6
    -   The following versions are supported and tested:
        -   CPython 3.7-3.12 (ubuntu, windows, mac)
        -   PyPy 3.7-3.10 (ubuntu, wundows, mac)
    -   `RESERVED_ATTRS` is now a list and version dependent
-   Fix `JsonFormatter.__init__` return type (`None`) - [@&#8203;nhairs](https://github.com/nhairs)
-   Moved to `pyproject.toml` - [@&#8203;nhairs](https://github.com/nhairs)
-   Update linting and testing - [@&#8203;nhairs](https://github.com/nhairs)
    -   Split lint and test steps in GHA
    -   Use validate-pyproject, black, pylint, mypy

#### New Contributors

**Full Changelog**: https://github.com/nhairs/python-json-logger/compare/v2.0.7...v3.0.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "* 0-3 * * 1" (UTC), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/GoogleCloudPlatform/microservices-demo).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4yMDAuMCIsInVwZGF0ZWRJblZlciI6IjM5LjIwMC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJsYW5nOiBweXRob24iXX0=-->
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant