diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c7332fee..faf69c686 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Fixed + +- Fixed pretty_repr for dataclasses in frozen (e.g. pyinstaller) bundles https://github.com/Textualize/rich/pull/3592 ## [13.9.4] - 2024-11-01 diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index d8985ca13..0b142af98 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -37,6 +37,7 @@ The following people have contributed to the development of Rich: - [Hugo van Kemenade](https://github.com/hugovk) - [Andrew Kettmann](https://github.com/akettmann) - [Alexander Krasnikov](https://github.com/askras) +- [Talley Lambert](https://github.com/tlambert03) - [Martin Larralde](https://github.com/althonos) - [Hedy Li](https://github.com/hedythedev) - [Henry Mai](https://github.com/tanducmai) diff --git a/rich/pretty.py b/rich/pretty.py index 5c725c0c5..ecdf3cf54 100644 --- a/rich/pretty.py +++ b/rich/pretty.py @@ -67,6 +67,9 @@ def _get_attr_fields(obj: Any) -> Sequence["_attr_module.Attribute[Any]"]: return _attr_module.fields(type(obj)) if _has_attrs else [] +IS_FROZEN = getattr(sys, "frozen", False) + + def _is_dataclass_repr(obj: object) -> bool: """Check if an instance of a dataclass contains the default repr. @@ -79,10 +82,10 @@ def _is_dataclass_repr(obj: object) -> bool: # Digging in to a lot of internals here # Catching all exceptions in case something is missing on a non CPython implementation try: - return obj.__repr__.__code__.co_filename in ( - dataclasses.__file__, - reprlib.__file__, - ) + accepted = {dataclasses.__file__, reprlib.__file__} + if IS_FROZEN: + accepted.update({"dataclasses.py", "reprlib.py"}) + return obj.__repr__.__code__.co_filename in accepted except Exception: # pragma: no coverage return False