Python change tracking utility with nested dict/list support and init/change log separation.
Project description
ChangeTracker — Python Change Tracking Utility
ChangeTracker — це бібліотека для відстеження змін у Python-об'єктах будь-якої складності (у т.ч. вкладені структури, списки, словники, кастомні класи).
Встановлення
#!todo
pip install <your-package-if-published>
Швидкий старт
1. Наслідуйте свій клас від ChangeTracker
from changetracker import ChangeTracker
class Address(ChangeTracker):
def __init__(self, city, street):
self.city = city
self.street = street
super().__init__() # обов'язковий виклик super().__init__() в кінці __init__
class User(ChangeTracker):
def __init__(self, name, age, address):
self.name = name
self.age = age
self.address = address
self.hobbies = ['reading']
super().__init__() # обов'язковий виклик super().__init__() в кінці __init__
2. Відстежуйте актуальний diff .get_changed_data()
from changetracker import ChangeTrackerLogs, ChangeTrackerLog
def print_diff(logsData: ChangeTrackerLogs):
for log in logsData.data:
log: ChangeTrackerLog
print(f"{log.field:10} | {log.action.value:8} | old: {log.old_value} | new: {log.new_value}")
user = User('Ivan', 25, Address('Kyiv', 'Khreshchatyk'))
# user: Зміна значення
user.age = 26
# user: Додавання нового поля
user.email = 'ivan@example.com'
# user: Зміна у списку
user.hobbies.append('sports')
# user: Видалення поля
# user.address: Видалення поля
del user.address.street
# user.address: Зміна поля
user.address.city = 'Lviv'
# user: Відображаємо наявні зміни з останнього .commit()
print_diff(user.get_changed_data())
Output:
# field: | action: | diff values:
age | changed | old: 25 | new: 26
address | changed | old: {'city': 'Kyiv', 'street': 'Khreshchatyk'} | new: {'city': 'Lviv'}
email | created | old: None | new: 'ivan@example.com'
hobbies | changed | old: ['reading'] | new: ['reading', 'sports']
# user.address: Відображаємо наявні зміни з останнього .commit()
print_diff(user.address.get_changed_data())
Output:
# field: | action: | diff values:
street | deleted | old: 'Khreshchatyk' | new: None
city | changed | old: 'Kyiv' | new: 'Lviv'
Фіксація змін .commit()
# Збереження всіх змін. Всі попередні записи з методу .get_changed_data() - скидаються
user.commit()
user.address.city = "Hostomel"
print_diff(user.address.get_changed_data())
Output:
# field: | action: | diff values:
city | changed | old: 'Lviv' | new: 'Hostomel'
Повний журнал змін .get_change_log()
get_change_log повертає повний журнал усіх зафіксованих змін (історію) через .commit(), а не лише поточні відмінності як get_changed_data.
# Збереження всіх змін. Всі попередні записи з методу .get_changed_data() - скидаються
user.commit()
# user: Відображаємо всю історію змін
for log in user.get_change_log().data:
print(f"{log.timestamp:%Y-%m-%d %H:%M:%S} | {log.commit_id} | {log.field:7} | {log.action.value:9} | old: {log.old_value} | new: {log.new_value}")
Output:
# date: | commit_id: | field: | action: | diff values:
2025-07-21 00:52:51 | 03ae3111-d41d-498f-874d-e8813581162a | age | created | old: None | new: 25
2025-07-21 00:52:51 | 03ae3111-d41d-498f-874d-e8813581162a | name | created | old: None | new: 'Ivan'
2025-07-21 00:52:51 | 03ae3111-d41d-498f-874d-e8813581162a | hobbies | created | old: None | new: ['reading']
2025-07-21 00:52:51 | 03ae3111-d41d-498f-874d-e8813581162a | address | created | old: None | new: {'city': 'Kyiv', 'street': 'Khreshchatyk'}
2025-07-21 00:53:01 | c05cc885-c670-4075-8b6d-dbec1bdb621f | age | changed | old: 25 | new: 26
2025-07-21 00:53:01 | c05cc885-c670-4075-8b6d-dbec1bdb621f | address | changed | old: {'city': 'Kyiv', 'street': 'Khreshchatyk'} | new: {'city': 'Lviv'}
2025-07-21 00:53:01 | c05cc885-c670-4075-8b6d-dbec1bdb621f | email | created | old: None | new: 'ivan@example.com'
2025-07-21 00:53:01 | c05cc885-c670-4075-8b6d-dbec1bdb621f | hobbies | changed | old: ['reading'] | new: ['reading', 'sports']
2025-07-21 01:11:52 | e59e6414-7e79-4e0f-8395-ec27d974ffe1 | address | changed | old: {'city': 'Lviv'} | new: {'city': 'Hostomel'}
# user.address: Відображаємо всю історію змін
for log in user.address.get_change_log().data:
print(f"{log.timestamp:%Y-%m-%d %H:%M:%S} | {log.commit_id} | {log.field:7} | {log.action.value:9} | old: {log.old_value} | new: {log.new_value}")
Output:
# date: | commit_id: | field: | action: | diff values:
2025-07-21 00:52:51 | 63803546-d96e-46f9-95b2-9a6554ead5f3 | street | created | old: None | new: 'Khreshchatyk'
2025-07-21 00:52:51 | 63803546-d96e-46f9-95b2-9a6554ead5f3 | city | created | old: None | new: 'Kyiv'
2025-07-21 00:53:01 | c05cc885-c670-4075-8b6d-dbec1bdb621f | street | deleted | old: 'Khreshchatyk' | new: None
2025-07-21 00:53:01 | c05cc885-c670-4075-8b6d-dbec1bdb621f | city | changed | old: 'Kyiv' | new: 'Lviv'
2025-07-21 01:11:52 | e59e6414-7e79-4e0f-8395-ec27d974ffe1 | city | changed | old: 'Lviv' | new: 'Hostomel'
Примітка: get_change_log показує всі зміни, які були зафіксовані через commit().
Особливості
- Відстеження змін будь-якої вкладеності
- Підтримка list, dict, кастомних класів
- Логування типу зміни: створення, видалення, зміна
- Гнучка фільтрація полів (public/private/all)
- Рекурсивне відстеження вкладених ChangeTracker об'єктів
- Повна історія змін з timestamp та commit_id
Ліцензія
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file changetracker-0.1.0.tar.gz.
File metadata
- Download URL: changetracker-0.1.0.tar.gz
- Upload date:
- Size: 12.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
02ba13841988bf5eabc7dd8d837509a6d661e5fa260ab25e6fd0218bc109256f
|
|
| MD5 |
7335548feada216d77b389241742afe9
|
|
| BLAKE2b-256 |
0ea1f3c4c5b698194524da58312e2f4f87cae5b870b53aaf9bc0296b4279ff0f
|
File details
Details for the file changetracker-0.1.0-py3-none-any.whl.
File metadata
- Download URL: changetracker-0.1.0-py3-none-any.whl
- Upload date:
- Size: 8.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c6647faae41162ced181281af71286d1529f5567a7d78d6672c467c20ec0f5d
|
|
| MD5 |
f4417ab81030d9764acafeb6dfa5a47e
|
|
| BLAKE2b-256 |
b72135f2e4c0c4c954bbb5c11067fa19fe16225be866dd4e60b55cf888cef393
|