Skip to content
Open

8.7.0 #579

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
a0ac96d
Fix ignore_keys issue in detailed__dict__
vitalis89 Sep 12, 2025
ad0c769
fixing type hints
ljames8 Sep 24, 2025
f1fc918
enable callable group_by
echan5 Sep 26, 2025
0265184
fix docstring examples for doctest errors
echan5 Sep 26, 2025
82d1b4b
add callable group_by tests
echan5 Sep 26, 2025
6140d2c
callable group_by documentation
echan5 Sep 26, 2025
c302877
fix doctest example
echan5 Sep 26, 2025
eec4a54
fix depedencies for testing
echan5 Sep 26, 2025
9a673fe
wqRevert "fix depedencies for testing"
echan5 Sep 30, 2025
1637bc3
Merge pull request #570 from ljames8/logarithmic-similarity-type-hint
seperman Oct 13, 2025
5655db0
removing unused imports
seperman Oct 13, 2025
e7da467
Fix colored view display when all list items are removed
yannrouillard Nov 4, 2025
5ca2874
Modify obj_to_dict_strategies for __slots__ handling
tpvasconcelos Jan 3, 2026
c474322
Implement tests for DeepHash with __slots__ classes
tpvasconcelos Jan 3, 2026
297a9ae
Always use t1 path
devin13cox Mar 6, 2026
68b9f31
adding official support for python 3.14
seperman Mar 11, 2026
ec78c2e
Problem: orjson.dumps() raises TypeError: Integer exceeds 64-bit rang…
seperman Mar 11, 2026
3fc2219
Bump version: 8.6.1 → 8.7.0
seperman Mar 11, 2026
bad0ee2
Problem: _convert_oversized_ints treated NamedTuples as plain tuples,…
seperman Mar 11, 2026
ad9cdf2
DeepDiff.to_dict() was not useful when the original view was 'tree' —…
seperman Mar 11, 2026
467e5ec
Dropped Python 3.9 support:
seperman Mar 11, 2026
327db34
updating the docs
seperman Mar 17, 2026
b1e3c11
Merge branch 'master' into dev
seperman Mar 18, 2026
ef1412f
renaming agents.md
seperman Mar 18, 2026
9a05c71
updating license
seperman Mar 18, 2026
e11cd99
fixing the links
seperman Mar 19, 2026
b6073b4
updating docs announcing DeepDiff moving under Qluster umbrella
seperman Mar 19, 2026
7bc3604
Fix typo in README
srini047 Mar 20, 2026
be7d59f
Merge pull request #585 from srini047/fix-readme-typo
seperman Mar 21, 2026
316f0c6
Merge pull request #567 from vitalis89/patch-1
seperman Mar 25, 2026
c06c3e8
Merge pull request #571 from echan5/callable-group-by
seperman Mar 25, 2026
07b7bda
upgrading our dependencies dependencies
seperman Mar 25, 2026
83bcc63
new uv lock
seperman Mar 25, 2026
edded17
Upgrading dependencies
seperman Mar 25, 2026
ffa7029
Merge pull request #573 from yannrouillard/fix/colored-view-empty-lis…
seperman Mar 25, 2026
ebc6171
1. Created FlatDeltaDict TypedDict in helper.py mirroring FlatDeltaRo…
seperman Mar 25, 2026
9f0a56c
adding colored view tests from commit by https://github.com/Nagato-Yu…
seperman Mar 25, 2026
6d750d4
Two bugs combined to make ignore_order=True miss int-vs-float type ch…
seperman Mar 25, 2026
6eb95f6
Merge pull request #584 from devin13cox/always-t1
seperman Mar 25, 2026
8676729
1. Improved comment in delta.py:556-558 — now references the path inv…
seperman Mar 25, 2026
f0b39cb
Merge pull request #577 from tpvasconcelos/master
seperman Mar 25, 2026
4338b06
The PR #577 used hasattr(o, i) to skip uninitialized slots, but hasat…
seperman Mar 25, 2026
f6f1117
updating docs
seperman Mar 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 8.6.2
current_version = 8.7.0
commit = True
tag = True
tag_name = {new_version}
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ A clear and concise description of what you expected to happen.
**OS, DeepDiff version and Python version (please complete the following information):**
- OS: [e.g. Ubuntu]
- Version [e.g. 20LTS]
- Python Version [e.g. 3.9.12]
- Python Version [e.g. 3.10.12]
- DeepDiff Version [e.g. 5.8.0]

**Additional context**
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ jobs:
build:
runs-on: ubuntu-latest
env:
DEFAULT_PYTHON: '3.12'
DEFAULT_PYTHON: '3.14'
strategy:
matrix:
python-version: ['3.9','3.10','3.11','3.12','3.13']
python-version: ['3.10','3.11','3.12','3.13','3.14']
architecture: ['x64']

steps:
Expand All @@ -29,18 +29,18 @@ jobs:
run: pip install nox==2025.5.1

- name: Lint with flake8
if: ${{ matrix.python-version == '3.12' }}
if: ${{ matrix.python-version == '3.14' }}
run: |
nox -s flake8 -- deepdiff --count --select=E9,F63,F7,F82 --show-source --statistics
nox -s flake8 -- deepdiff --count --exit-zero --max-complexity=26 --max-line-length=250 --statistics

- name: Test with pytest (no coverage)
if: ${{ matrix.python-version != '3.12' }}
if: ${{ matrix.python-version != '3.14' }}
run: |
nox -s pytest-${{ matrix.python-version }} -- --benchmark-disable tests/

- name: Test with pytest (+ coverage)
if: ${{ matrix.python-version == '3.12' }}
if: ${{ matrix.python-version == '3.14' }}
run: |
nox -s pytest-${{ matrix.python-version }} -- \
--benchmark-disable \
Expand All @@ -49,7 +49,7 @@ jobs:
tests/ --runslow

- name: Upload coverage
if: ${{ matrix.python-version == '3.12' }}
if: ${{ matrix.python-version == '3.14' }}
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
8 changes: 8 additions & 0 deletions AUTHORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,11 @@ Authors in order of the timeline of their contributions:
- [Enji Cooper](https://github.com/ngie-eign) for converting legacy setuptools use to pyproject.toml
- [Diogo Correia](https://github.com/diogotcorreia) for reporting security vulnerability in Delta and DeepDiff that could allow remote code execution.
- [am-periphery](https://github.com/am-periphery) for reporting CVE-2026-33155: denial-of-service via crafted pickle payloads triggering massive memory allocation.
- [echan5](https://github.com/echan5) for adding callable `group_by` support.
- [yannrouillard](https://github.com/yannrouillard) for fixing colored view display when all list items are removed.
- [tpvasconcelos](https://github.com/tpvasconcelos) for fixing `__slots__` handling for objects with `__getattr__`.
- [devin13cox](https://github.com/devin13cox) for always using t1 path for reporting.
- [vitalis89](https://github.com/vitalis89) for fixing `ignore_keys` issue in `detailed__dict__`.
- [ljames8](https://github.com/ljames8) for fixing logarithmic similarity type hint.
- [srini047](https://github.com/srini047) for fixing README typo.
- [Nagato-Yuzuru](https://github.com/Nagato-Yuzuru) for colored view tests.
17 changes: 16 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,23 @@
# DeepDiff Change log

- v8-7-0
- migration note:
- `to_dict()` and `to_json()` now accept a `verbose_level` parameter and always return a usable text-view dict. When the original view is `'tree'`, they default to `verbose_level=2` for full detail. The old `view_override` parameter is removed. To get the previous results, you will need to pass the explicit verbose_level to `to_json` and `to_dict` if you are using the tree view.
- Dropping support for Python 3.9
- Support for python 3.14
- Added support for callable `group_by` thanks to [echan5](https://github.com/echan5)
- Added `FlatDeltaDict` TypedDict for `to_flat_dicts` return type
- Fixed colored view display when all list items are removed thanks to [yannrouillard](https://github.com/yannrouillard)
- Fixed `hasattr()` swallowing `AttributeError` in `__slots__` handling for objects with `__getattr__` thanks to [tpvasconcelos](https://github.com/tpvasconcelos)
- Fixed `ignore_order=True` missing int-vs-float type changes
- Always use t1 path for reporting thanks to [devin13cox](https://github.com/devin13cox)
- Fixed `_convert_oversized_ints` failing on NamedTuples
- Fixed orjson `TypeError` for integers exceeding 64-bit range
- Fixed parameter bug in `to_flat_dicts` where `include_action_in_path` and `report_type_changes` were not being passed through
- Fixed `ignore_keys` issue in `detailed__dict__` thanks to [vitalis89](https://github.com/vitalis89)
- Fixed logarithmic similarity type hint thanks to [ljames8](https://github.com/ljames8)
- v8-6-2
- Security fix (CVE-2026-33155): Prevent denial-of-service via crafted pickle payloads that trigger massive memory allocation through the REDUCE opcode. Size-sensitive callables like `bytes()` and `bytearray()` are now wrapped to reject allocations exceeding 128 MB.

- v8-6-1
- Patched security vulnerability in the Delta class which was vulnerable to class pollution via its constructor, and when combined with a gadget available in DeltaDiff itself, it could lead to Denial of Service and Remote Code Execution (via insecure Pickle deserialization).

Expand Down
4 changes: 2 additions & 2 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ authors:
given-names: "Sep"
orcid: "https://orcid.org/0009-0009-5828-4345"
title: "DeepDiff"
version: 8.6.2
date-released: 2024
version: 8.7.0
date-released: 2026
url: "https://github.com/seperman/deepdiff"
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ nox

## Development Notes

- **Python Support**: 3.9+ and PyPy3
- **Python Support**: 3.10+ and PyPy3
- **Main Branch**: `master` (PRs typically go to `dev` branch)
- **Build System**: Modern `pyproject.toml` with `flit_core`
- **Dependencies**: Core dependency is `orderly-set>=5.4.1,<6`
Expand Down
5 changes: 3 additions & 2 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
The MIT License (MIT)

Copyright (c) 2014 - 2021 Sep Dehpour (Seperman) and contributors
www.zepworks.com
Copyright (c) 2014 - 2026 Sep Dehpour (Seperman) and contributors
qluster.ai
zepworks.com

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
40 changes: 25 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
# DeepDiff v 8.6.2
# DeepDiff v 8.7.0

![Downloads](https://img.shields.io/pypi/dm/deepdiff.svg?style=flat)
![Python Versions](https://img.shields.io/pypi/pyversions/deepdiff.svg?style=flat)
![License](https://img.shields.io/pypi/l/deepdiff.svg?version=latest)
[![Build Status](https://github.com/seperman/deepdiff/workflows/Unit%20Tests/badge.svg)](https://github.com/seperman/deepdiff/actions)
[![codecov](https://codecov.io/gh/seperman/deepdiff/branch/master/graph/badge.svg?token=KkHZ3siA3m)](https://codecov.io/gh/seperman/deepdiff)

**DeepDiff is now part of [Qluster](https://qluster.ai).**

*If you're building workflows around data validation and correction, [Qluster](https://qluster.ai) gives your team a structured way to manage rules, review failures, approve fixes, and reuse decisions—without building the entire system from scratch.*

## Modules

- [DeepDiff](https://zepworks.com/deepdiff/current/diff.html): Deep Difference of dictionaries, iterables, strings, and ANY other object.
Expand All @@ -15,14 +19,31 @@
- [Extract](https://zepworks.com/deepdiff/current/extract.html): Extract an item from a nested Python object using its path.
- [commandline](https://zepworks.com/deepdiff/current/commandline.html): Use DeepDiff from commandline.

Tested on Python 3.9+ and PyPy3.
Tested on Python 3.10+ and PyPy3.

- **[Documentation](https://zepworks.com/deepdiff/8.6.2/)**
- **[Documentation](https://zepworks.com/deepdiff/8.7.0/)**

## What is new?

Please check the [ChangeLog](CHANGELOG.md) file for the detailed information.

DeepDiff 8-7-0
- migration note:
- `to_dict()` and `to_json()` now accept a `verbose_level` parameter and always return a usable text-view dict. When the original view is `'tree'`, they default to `verbose_level=2` for full detail. The old `view_override` parameter is removed. To get the previous results, you will need to pass the explicit verbose_level to `to_json` and `to_dict` if you are using the tree view.
- Dropping support for Python 3.9
- Support for python 3.14
- Added support for callable `group_by` thanks to @echan5
- Added `FlatDeltaDict` TypedDict for `to_flat_dicts` return type
- Fixed colored view display when all list items are removed thanks to @yannrouillard
- Fixed `hasattr()` swallowing `AttributeError` in `__slots__` handling for objects with `__getattr__` thanks to @tpvasconcelos
- Fixed `ignore_order=True` missing int-vs-float type changes
- Always use t1 path for reporting thanks to @devin13cox
- Fixed `_convert_oversized_ints` failing on NamedTuples
- Fixed orjson `TypeError` for integers exceeding 64-bit range
- Fixed parameter bug in `to_flat_dicts` where `include_action_in_path` and `report_type_changes` were not being passed through
- Fixed `ignore_keys` issue in `detailed__dict__` thanks to @vitalis89
- Fixed logarithmic similarity type hint thanks to @ljames8

DeepDiff 8-6-2
- **Security (CVE-2026-33155):** Fixed a memory exhaustion DoS vulnerability in `_RestrictedUnpickler` by limiting the maximum allocation size for `bytes` and `bytearray` during deserialization.

Expand Down Expand Up @@ -84,7 +105,7 @@ If you want to improve the performance of DeepDiff with certain functionalities
Install optional packages:
- [yaml](https://pypi.org/project/PyYAML/)
- [tomli](https://pypi.org/project/tomli/) (python 3.10 and older) and [tomli-w](https://pypi.org/project/tomli-w/) for writing
- [clevercsv](https://pypi.org/project/clevercsv/) for more rubust CSV parsing
- [clevercsv](https://pypi.org/project/clevercsv/) for more robust CSV parsing
- [orjson](https://pypi.org/project/orjson/) for speed and memory optimized parsing
- [pydantic](https://pypi.org/project/pydantic/)

Expand All @@ -93,17 +114,6 @@ Install optional packages:

<https://zepworks.com/deepdiff/current/>

### A message from Sep, the creator of DeepDiff

> 👋 Hi there,
>
> Thank you for using DeepDiff!
> As an engineer, I understand the frustration of wrestling with **unruly data** in pipelines.
> That's why I developed a new tool - [Qluster](https://qluster.ai/solution) to empower non-engineers to control and resolve data issues at scale autonomously and **stop bugging the engineers**! 🛠️
>
> If you are going through this pain now, I would love to give you [early access](https://www.qluster.ai/try-qluster) to Qluster and get your feedback.


# ChangeLog

Please take a look at the [CHANGELOG](CHANGELOG.md) file.
Expand Down
2 changes: 1 addition & 1 deletion deepdiff/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""This module offers the DeepDiff, DeepSearch, grep, Delta and DeepHash classes."""
# flake8: noqa
__version__ = '8.6.2'
__version__ = '8.7.0'
import logging

if __name__ == '__main__':
Expand Down
5 changes: 3 additions & 2 deletions deepdiff/colored_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,10 @@ def _colorize_json(self, obj: Any, path: str = 'root', indent: int = 0) -> str:
return '{\n' + ',\n'.join(items) + f'\n{current_indent}' + '}'

elif isinstance(obj, (list, tuple)):
if not obj:
return '[]'
removed_map = self._get_path_removed(path)
if not obj and not removed_map:
return '[]'

for index in removed_map:
self._colorize_skip_paths.add(f"{path}[{index}]")

Expand Down
Loading
Loading