PyHardLinkBackup 1.8.4__tar.gz → 1.9.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/.pre-commit-config.yaml +1 -1
- pyhardlinkbackup-1.9.0/.venv-app/lib/python3.14/site-packages/cli_base/tests/shell_complete_snapshots/.gitignore +1 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PKG-INFO +8 -5
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/__init__.py +1 -1
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/backup.py +3 -2
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/cli_app/__init__.py +3 -2
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/tests/test_backup.py +25 -19
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/tests/test_project_setup.py +1 -1
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/tests/test_readme.py +0 -6
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/file_hash_database.py +3 -10
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/tests/test_file_hash_database.py +27 -7
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/README.md +6 -3
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/docs/README.md +9 -4
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/pyproject.toml +3 -2
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/uv.lock +77 -76
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/.editorconfig +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/.github/workflows/tests.yml +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/.gitignore +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/.idea/.gitignore +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/.pre-commit-hooks.yaml +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/.run/Template Python tests.run.xml +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/.run/Unittests - __all__.run.xml +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/.run/cli.py --help.run.xml +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/.run/dev-cli update.run.xml +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/.run/only DocTests.run.xml +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/.run/only DocWrite.run.xml +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/.venv-app/.gitignore +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/LICENSE +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/__main__.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/cli_app/phlb.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/cli_dev/__init__.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/cli_dev/__main__.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/cli_dev/benchmark.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/cli_dev/code_style.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/cli_dev/debugging.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/cli_dev/packaging.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/cli_dev/testing.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/cli_dev/update_readme_history.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/compare_backup.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/constants.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/logging_setup.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/rebuild_databases.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/tests/__init__.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/tests/test_compare_backup.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/tests/test_doc_write.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/tests/test_doctests.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/tests/test_readme_history.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/tests/test_rebuild_database.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/__init__.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/file_size_database.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/filesystem.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/humanize.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/rich_utils.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/sha256sums.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/tee.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/tests/__init__.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/tests/test_file_size_database.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/tests/test_filesystem.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/tests/unittest_utilities.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/tyro_cli_shared_args.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/cli.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/dev-cli.py +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/dist/.gitignore +0 -0
- {pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/noxfile.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!.*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PyHardLinkBackup
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.9.0
|
|
4
4
|
Summary: HardLink/Deduplication Backups with Python
|
|
5
5
|
Project-URL: Documentation, https://github.com/jedie/PyHardLinkBackup
|
|
6
6
|
Project-URL: Source, https://github.com/jedie/PyHardLinkBackup
|
|
@@ -9,7 +9,7 @@ License: GPL-3.0-or-later
|
|
|
9
9
|
License-File: LICENSE
|
|
10
10
|
Requires-Python: >=3.12
|
|
11
11
|
Requires-Dist: bx-py-utils
|
|
12
|
-
Requires-Dist: cli-base-utilities
|
|
12
|
+
Requires-Dist: cli-base-utilities
|
|
13
13
|
Requires-Dist: rich
|
|
14
14
|
Requires-Dist: tyro
|
|
15
15
|
Description-Content-Type: text/markdown
|
|
@@ -298,6 +298,9 @@ Overview of main changes:
|
|
|
298
298
|
|
|
299
299
|
[comment]: <> (✂✂✂ auto generated history start ✂✂✂)
|
|
300
300
|
|
|
301
|
+
* [v1.9.0](https://github.com/jedie/PyHardLinkBackup/compare/v1.8.4...v1.9.0)
|
|
302
|
+
* 2026-04-14 - Update existing links in has database
|
|
303
|
+
* 2026-04-14 - Update requirements
|
|
301
304
|
* [v1.8.4](https://github.com/jedie/PyHardLinkBackup/compare/v1.8.3...v1.8.4)
|
|
302
305
|
* 2026-04-09 - Update requirements
|
|
303
306
|
* 2026-04-09 - Apply project updates
|
|
@@ -311,6 +314,9 @@ Overview of main changes:
|
|
|
311
314
|
* 2026-03-28 - Update requirements
|
|
312
315
|
* 2026-03-28 - apply manageprojects updates
|
|
313
316
|
* 2026-03-25 - fix some code styles
|
|
317
|
+
|
|
318
|
+
<details><summary>Expand older history entries ...</summary>
|
|
319
|
+
|
|
314
320
|
* [v1.8.1](https://github.com/jedie/PyHardLinkBackup/compare/v1.8.0...v1.8.1)
|
|
315
321
|
* 2026-01-24 - Update packaging commands related to new direct "uv" usage
|
|
316
322
|
* 2026-01-24 - Bugfix "rebuild" command
|
|
@@ -320,9 +326,6 @@ Overview of main changes:
|
|
|
320
326
|
* 2026-01-22 - rebuid command: skip hashing same files by check the inode uniqueness
|
|
321
327
|
* 2026-01-22 - Add "fs-info" in dev cli
|
|
322
328
|
* 2026-01-22 - rebuild command: fix wrong progress bar
|
|
323
|
-
|
|
324
|
-
<details><summary>Expand older history entries ...</summary>
|
|
325
|
-
|
|
326
329
|
* [v1.8.0](https://github.com/jedie/PyHardLinkBackup/compare/v1.7.3...v1.8.0)
|
|
327
330
|
* 2026-01-22 - Add optional "--name" to enforce a name for the backup sub directory
|
|
328
331
|
* 2026-01-22 - Do not cross filesystem boundaries as default
|
|
@@ -130,7 +130,6 @@ def backup_one_file(
|
|
|
130
130
|
else:
|
|
131
131
|
logger.info('Store unique file: %s to %s', src_path, dst_path)
|
|
132
132
|
dst_path.write_bytes(file_content)
|
|
133
|
-
hash_db[file_hash] = dst_path
|
|
134
133
|
backup_result.copied_files += 1
|
|
135
134
|
backup_result.copied_size += size
|
|
136
135
|
|
|
@@ -146,10 +145,12 @@ def backup_one_file(
|
|
|
146
145
|
else:
|
|
147
146
|
logger.info('Copy unique file: %s to %s', src_path, dst_path)
|
|
148
147
|
copy_with_progress(src_path, dst_path, progress=progress, total_size=size)
|
|
149
|
-
hash_db[file_hash] = dst_path
|
|
150
148
|
backup_result.copied_files += 1
|
|
151
149
|
backup_result.copied_size += size
|
|
152
150
|
|
|
151
|
+
# Store new file in hash database or update existing entry to latest backuped file:
|
|
152
|
+
hash_db[file_hash] = dst_path
|
|
153
|
+
|
|
153
154
|
# Keep original file metadata (permission bits, time stamps, and flags)
|
|
154
155
|
shutil.copystat(src_path, dst_path)
|
|
155
156
|
else:
|
|
@@ -31,9 +31,10 @@ def version():
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
def main(args: Sequence[str] | None = None):
|
|
34
|
-
|
|
34
|
+
project_name = 'phlb' # Enforce program name if pipx used
|
|
35
|
+
print_version(PyHardLinkBackup, project_name=project_name)
|
|
35
36
|
app.cli(
|
|
36
|
-
prog=
|
|
37
|
+
prog=project_name,
|
|
37
38
|
description=constants.CLI_EPILOG,
|
|
38
39
|
use_underscores=False, # use hyphens instead of underscores
|
|
39
40
|
sort_subcommands=True,
|
|
@@ -274,6 +274,7 @@ class BackupTreeTestCase(
|
|
|
274
274
|
'wb backups/source/2026-01-01-123456/min_sized_file1.bin',
|
|
275
275
|
'w backups/.phlb/hash-lookup/bb/c4/bbc4de2ca238d1ec41fb622b75b5cf7d31a6d2ac92405043dd8f8220364fefc8',
|
|
276
276
|
'a backups/source/2026-01-01-123456/SHA256SUMS',
|
|
277
|
+
'w backups/.phlb/hash-lookup/bb/c4/bbc4de2ca238d1ec41fb622b75b5cf7d31a6d2ac92405043dd8f8220364fefc8',
|
|
277
278
|
'a backups/source/2026-01-01-123456/SHA256SUMS',
|
|
278
279
|
'w backups/source/2026-01-01-123456-summary.txt',
|
|
279
280
|
],
|
|
@@ -320,7 +321,7 @@ class BackupTreeTestCase(
|
|
|
320
321
|
assert_hash_db_info(
|
|
321
322
|
backup_root=self.backup_root,
|
|
322
323
|
expected="""
|
|
323
|
-
bb/c4/bbc4de2ca238d1… -> source/2026-01-01-123456/
|
|
324
|
+
bb/c4/bbc4de2ca238d1… -> source/2026-01-01-123456/min_sized_file2.bin
|
|
324
325
|
e3/71/e3711d0eacddeb… -> source/2026-01-01-123456/large_file1.bin
|
|
325
326
|
""",
|
|
326
327
|
)
|
|
@@ -416,15 +417,15 @@ class BackupTreeTestCase(
|
|
|
416
417
|
redirected_out.stdout,
|
|
417
418
|
)
|
|
418
419
|
|
|
419
|
-
# The FileHashDatabase
|
|
420
|
+
# The FileHashDatabase always points to the latest backed-up files:
|
|
420
421
|
with self.assertLogs('PyHardLinkBackup', level=logging.DEBUG):
|
|
421
422
|
assert_hash_db_info(
|
|
422
423
|
backup_root=self.backup_root,
|
|
423
424
|
expected="""
|
|
424
425
|
23/d2/23d2ce40d26211… -> source/2026-01-02-123456/min_sized_file_newA.bin
|
|
425
426
|
9a/56/9a567077114134… -> source/2026-01-02-123456/min_sized_file_newB.bin
|
|
426
|
-
bb/c4/bbc4de2ca238d1… -> source/2026-01-
|
|
427
|
-
e3/71/e3711d0eacddeb… -> source/2026-01-
|
|
427
|
+
bb/c4/bbc4de2ca238d1… -> source/2026-01-02-123456/min_sized_file2.bin
|
|
428
|
+
e3/71/e3711d0eacddeb… -> source/2026-01-02-123456/large_file2.bin
|
|
428
429
|
""",
|
|
429
430
|
)
|
|
430
431
|
|
|
@@ -463,9 +464,13 @@ class BackupTreeTestCase(
|
|
|
463
464
|
'a backups/source/2026-01-02-123456/SHA256SUMS',
|
|
464
465
|
'wb backups/source/2026-01-02-123456/hardlink2file1',
|
|
465
466
|
'a backups/source/2026-01-02-123456/SHA256SUMS',
|
|
467
|
+
'w backups/.phlb/hash-lookup/e3/71/e3711d0eacddeb105af4ad9b0d63069d759acf32e49712663419e68dc294a94a',
|
|
466
468
|
'a backups/source/2026-01-02-123456/SHA256SUMS',
|
|
469
|
+
'w backups/.phlb/hash-lookup/e3/71/e3711d0eacddeb105af4ad9b0d63069d759acf32e49712663419e68dc294a94a',
|
|
467
470
|
'a backups/source/2026-01-02-123456/SHA256SUMS',
|
|
471
|
+
'w backups/.phlb/hash-lookup/bb/c4/bbc4de2ca238d1ec41fb622b75b5cf7d31a6d2ac92405043dd8f8220364fefc8',
|
|
468
472
|
'a backups/source/2026-01-02-123456/SHA256SUMS',
|
|
473
|
+
'w backups/.phlb/hash-lookup/bb/c4/bbc4de2ca238d1ec41fb622b75b5cf7d31a6d2ac92405043dd8f8220364fefc8',
|
|
469
474
|
'a backups/source/2026-01-02-123456/SHA256SUMS',
|
|
470
475
|
'wb backups/source/2026-01-02-123456/min_sized_file_newA.bin',
|
|
471
476
|
'w backups/.phlb/hash-lookup/23/d2/23d2ce40d26211a9ffe8096fd1f927f2abd094691839d24f88440f7c5168d500',
|
|
@@ -499,8 +504,8 @@ class BackupTreeTestCase(
|
|
|
499
504
|
# Don't create broken hardlinks!
|
|
500
505
|
|
|
501
506
|
"""DocWrite: README.md ## FileHashDatabase - Missing hardlink target file
|
|
502
|
-
|
|
503
|
-
|
|
507
|
+
Deleting files from old backups is safe: the hash DB entry always points to the
|
|
508
|
+
most recently backed-up file, so subsequent backups can still create hardlinks.
|
|
504
509
|
"""
|
|
505
510
|
|
|
506
511
|
# Let's remove one of the files used for hardlinking from the first backup:
|
|
@@ -515,8 +520,8 @@ class BackupTreeTestCase(
|
|
|
515
520
|
self.assertIn('Backup complete', redirected_out.stdout)
|
|
516
521
|
backup_dir = result.backup_dir
|
|
517
522
|
|
|
518
|
-
# Note: min_sized_file1.bin and min_sized_file2.bin
|
|
519
|
-
#
|
|
523
|
+
# Note: min_sized_file1.bin and min_sized_file2.bin accumulate hardlinks
|
|
524
|
+
# because hash_db always points to the latest backup file.
|
|
520
525
|
with self.assertLogs('PyHardLinkBackup', level=logging.DEBUG):
|
|
521
526
|
assert_fs_tree_overview(
|
|
522
527
|
root=backup_dir,
|
|
@@ -527,8 +532,8 @@ class BackupTreeTestCase(
|
|
|
527
532
|
hardlink2file1 12:00:00 file 1 14 8a11514a
|
|
528
533
|
large_file1.bin 12:00:00 hardlink 5 1001 fb3014ff
|
|
529
534
|
large_file2.bin 12:00:00 hardlink 5 1001 fb3014ff
|
|
530
|
-
min_sized_file1.bin 12:00:00 hardlink
|
|
531
|
-
min_sized_file2.bin 12:00:00 hardlink
|
|
535
|
+
min_sized_file1.bin 12:00:00 hardlink 5 1000 f0d93de4
|
|
536
|
+
min_sized_file2.bin 12:00:00 hardlink 5 1000 f0d93de4
|
|
532
537
|
min_sized_file_newA.bin 12:00:00 hardlink 2 1001 a48f0e33
|
|
533
538
|
min_sized_file_newB.bin 12:00:00 hardlink 2 1000 7d9c564d
|
|
534
539
|
small_file_newA.txt 12:00:00 file 1 10 76d1acf1
|
|
@@ -547,26 +552,26 @@ class BackupTreeTestCase(
|
|
|
547
552
|
backup_count=12,
|
|
548
553
|
backup_size=6091,
|
|
549
554
|
symlink_files=1,
|
|
550
|
-
hardlinked_files=
|
|
551
|
-
hardlinked_size=
|
|
552
|
-
copied_files=
|
|
553
|
-
copied_size=
|
|
555
|
+
hardlinked_files=6,
|
|
556
|
+
hardlinked_size=6003,
|
|
557
|
+
copied_files=5,
|
|
558
|
+
copied_size=74,
|
|
554
559
|
copied_small_files=5,
|
|
555
560
|
copied_small_size=74,
|
|
556
561
|
error_count=0,
|
|
557
562
|
),
|
|
558
563
|
)
|
|
559
564
|
|
|
560
|
-
#
|
|
565
|
+
# All files points now to "2026-01-03" and non of them to the first "2026-01-01" backup:
|
|
561
566
|
self.assertEqual(backup_dir.name, '2026-01-03-123456') # Latest backup dir name
|
|
562
567
|
with self.assertLogs('PyHardLinkBackup', level=logging.DEBUG):
|
|
563
568
|
assert_hash_db_info(
|
|
564
569
|
backup_root=self.backup_root,
|
|
565
570
|
expected="""
|
|
566
|
-
23/d2/23d2ce40d26211… -> source/2026-01-
|
|
567
|
-
9a/56/9a567077114134… -> source/2026-01-
|
|
568
|
-
bb/c4/bbc4de2ca238d1… -> source/2026-01-03-123456/
|
|
569
|
-
e3/71/e3711d0eacddeb… -> source/2026-01-
|
|
571
|
+
23/d2/23d2ce40d26211… -> source/2026-01-03-123456/min_sized_file_newA.bin
|
|
572
|
+
9a/56/9a567077114134… -> source/2026-01-03-123456/min_sized_file_newB.bin
|
|
573
|
+
bb/c4/bbc4de2ca238d1… -> source/2026-01-03-123456/min_sized_file2.bin
|
|
574
|
+
e3/71/e3711d0eacddeb… -> source/2026-01-03-123456/large_file2.bin
|
|
570
575
|
""",
|
|
571
576
|
)
|
|
572
577
|
|
|
@@ -916,6 +921,7 @@ class BackupTreeTestCase(
|
|
|
916
921
|
[
|
|
917
922
|
'w backups/.phlb_test',
|
|
918
923
|
'a backups/source/2026-02-22-123456-backup.log',
|
|
924
|
+
'w backups/.phlb/hash-lookup/23/d2/23d2ce40d26211a9ffe8096fd1f927f2abd094691839d24f88440f7c5168d500',
|
|
919
925
|
'a backups/source/2026-02-22-123456/SHA256SUMS',
|
|
920
926
|
'wb backups/source/2026-02-22-123456/large_fileB.txt',
|
|
921
927
|
'w backups/.phlb/hash-lookup/2a/92/2a925556d3ec9e4258624a324cd9300a9a3d9c86dac6bbbb63071bdb7787afd2',
|
{pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/tests/test_project_setup.py
RENAMED
|
@@ -22,7 +22,7 @@ class ProjectSetupTestCase(TestCase):
|
|
|
22
22
|
assert_is_file(cli_bin)
|
|
23
23
|
|
|
24
24
|
output = subprocess.check_output([cli_bin, 'version'], text=True)
|
|
25
|
-
self.assertIn(f'
|
|
25
|
+
self.assertIn(f'phlb v{__version__}', output)
|
|
26
26
|
|
|
27
27
|
dev_cli_bin = PACKAGE_ROOT / 'dev-cli.py'
|
|
28
28
|
assert_is_file(dev_cli_bin)
|
|
@@ -47,9 +47,6 @@ class ReadmeTestCase(BaseTestCase):
|
|
|
47
47
|
),
|
|
48
48
|
)
|
|
49
49
|
|
|
50
|
-
# Installed via pipx is called 'phlb', not 'cli.py':
|
|
51
|
-
stdout = stdout.replace('./cli.py', 'phlb')
|
|
52
|
-
|
|
53
50
|
assert_cli_help_in_readme(text_block=stdout, marker='main help')
|
|
54
51
|
|
|
55
52
|
def test_backup_help(self):
|
|
@@ -63,9 +60,6 @@ class ReadmeTestCase(BaseTestCase):
|
|
|
63
60
|
),
|
|
64
61
|
)
|
|
65
62
|
|
|
66
|
-
# Installed via pipx is called 'phlb', not 'cli.py':
|
|
67
|
-
stdout = stdout.replace('./cli.py', 'phlb')
|
|
68
|
-
|
|
69
63
|
assert_cli_help_in_readme(text_block=stdout, marker='backup help')
|
|
70
64
|
|
|
71
65
|
def test_dev_help(self):
|
{pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/file_hash_database.py
RENAMED
|
@@ -5,10 +5,6 @@ from pathlib import Path
|
|
|
5
5
|
logger = logging.getLogger(__name__)
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
class HashAlreadyExistsError(ValueError):
|
|
9
|
-
pass
|
|
10
|
-
|
|
11
|
-
|
|
12
8
|
class FileHashDatabase:
|
|
13
9
|
"""DocWrite: README.md ## FileHashDatabase
|
|
14
10
|
A simple "database" to store file content hash <-> relative path mappings.
|
|
@@ -54,12 +50,9 @@ class FileHashDatabase:
|
|
|
54
50
|
return abs_file_path
|
|
55
51
|
|
|
56
52
|
def __setitem__(self, hash: str, abs_file_path: Path):
|
|
53
|
+
"""
|
|
54
|
+
Create or update the hash entry with the given absolute file path.
|
|
55
|
+
"""
|
|
57
56
|
hash_path = self._get_hash_path(hash)
|
|
58
57
|
hash_path.parent.mkdir(parents=True, exist_ok=True)
|
|
59
|
-
|
|
60
|
-
# File should be found before and results in hardlink creation!
|
|
61
|
-
# So deny change of existing hashes:
|
|
62
|
-
if hash_path.exists():
|
|
63
|
-
raise HashAlreadyExistsError(f'Hash {hash} already exists in the database!')
|
|
64
|
-
|
|
65
58
|
hash_path.write_text(str(abs_file_path.relative_to(self.backup_root)))
|
|
@@ -8,7 +8,7 @@ from bx_py_utils.test_utils.assertion import assert_text_equal
|
|
|
8
8
|
from bx_py_utils.test_utils.log_utils import NoLogs
|
|
9
9
|
from cli_base.cli_tools.test_utils.base_testcases import BaseTestCase
|
|
10
10
|
|
|
11
|
-
from PyHardLinkBackup.utilities.file_hash_database import FileHashDatabase
|
|
11
|
+
from PyHardLinkBackup.utilities.file_hash_database import FileHashDatabase
|
|
12
12
|
from PyHardLinkBackup.utilities.filesystem import iter_scandir_files
|
|
13
13
|
|
|
14
14
|
|
|
@@ -127,10 +127,28 @@ class FileHashDatabaseTestCase(BaseTestCase):
|
|
|
127
127
|
)
|
|
128
128
|
|
|
129
129
|
########################################################################################
|
|
130
|
-
#
|
|
130
|
+
# Update existing hash to point to a newer file:
|
|
131
131
|
|
|
132
|
-
|
|
133
|
-
|
|
132
|
+
"""DocWrite: README.md ## FileHashDatabase
|
|
133
|
+
The entry for each hash is always updated to point to the most recently backed-up file.
|
|
134
|
+
This means you can safely delete old backups: the hash DB will still point to a valid
|
|
135
|
+
file in the most recent backup, so deduplication continues to work correctly.
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
file_c_path = backup_root_path / 'rel/path/to/file-C'
|
|
139
|
+
file_c_path.parent.mkdir(parents=True, exist_ok=True)
|
|
140
|
+
file_c_path.touch()
|
|
141
|
+
|
|
142
|
+
hash_db['12abcd345678abcdef'] = file_c_path
|
|
143
|
+
self.assertEqual(hash_db.get('12abcd345678abcdef'), file_c_path)
|
|
144
|
+
with self.assertLogs('PyHardLinkBackup', level=logging.DEBUG):
|
|
145
|
+
assert_hash_db_info(
|
|
146
|
+
backup_root=hash_db.backup_root,
|
|
147
|
+
expected="""
|
|
148
|
+
12/34/12345678abcdef… -> rel/path/to/file-A
|
|
149
|
+
12/ab/12abcd345678ab… -> rel/path/to/file-C
|
|
150
|
+
""",
|
|
151
|
+
)
|
|
134
152
|
|
|
135
153
|
########################################################################################
|
|
136
154
|
# Don't use stale entries pointing to missing files:
|
|
@@ -139,8 +157,10 @@ class FileHashDatabaseTestCase(BaseTestCase):
|
|
|
139
157
|
file_a_path.unlink()
|
|
140
158
|
|
|
141
159
|
"""DocWrite: README.md ## FileHashDatabase - Missing hardlink target file
|
|
142
|
-
|
|
143
|
-
|
|
160
|
+
The `get()` method checks whether the referenced file still exists.
|
|
161
|
+
If not, the stale entry is removed and a warning is logged.
|
|
162
|
+
On the next backup run, the file is then copied fresh instead of hardlinked.
|
|
163
|
+
"""
|
|
144
164
|
with self.assertLogs(level=logging.WARNING) as logs:
|
|
145
165
|
self.assertIs(hash_db.get('12345678abcdef'), None)
|
|
146
166
|
self.assertIn('Hash database entry found, but file does not exist', ''.join(logs.output))
|
|
@@ -148,6 +168,6 @@ class FileHashDatabaseTestCase(BaseTestCase):
|
|
|
148
168
|
assert_hash_db_info(
|
|
149
169
|
backup_root=hash_db.backup_root,
|
|
150
170
|
expected="""
|
|
151
|
-
12/ab/12abcd345678ab… -> rel/path/to/file-
|
|
171
|
+
12/ab/12abcd345678ab… -> rel/path/to/file-C
|
|
152
172
|
""",
|
|
153
173
|
)
|
|
@@ -282,6 +282,9 @@ Overview of main changes:
|
|
|
282
282
|
|
|
283
283
|
[comment]: <> (✂✂✂ auto generated history start ✂✂✂)
|
|
284
284
|
|
|
285
|
+
* [v1.9.0](https://github.com/jedie/PyHardLinkBackup/compare/v1.8.4...v1.9.0)
|
|
286
|
+
* 2026-04-14 - Update existing links in has database
|
|
287
|
+
* 2026-04-14 - Update requirements
|
|
285
288
|
* [v1.8.4](https://github.com/jedie/PyHardLinkBackup/compare/v1.8.3...v1.8.4)
|
|
286
289
|
* 2026-04-09 - Update requirements
|
|
287
290
|
* 2026-04-09 - Apply project updates
|
|
@@ -295,6 +298,9 @@ Overview of main changes:
|
|
|
295
298
|
* 2026-03-28 - Update requirements
|
|
296
299
|
* 2026-03-28 - apply manageprojects updates
|
|
297
300
|
* 2026-03-25 - fix some code styles
|
|
301
|
+
|
|
302
|
+
<details><summary>Expand older history entries ...</summary>
|
|
303
|
+
|
|
298
304
|
* [v1.8.1](https://github.com/jedie/PyHardLinkBackup/compare/v1.8.0...v1.8.1)
|
|
299
305
|
* 2026-01-24 - Update packaging commands related to new direct "uv" usage
|
|
300
306
|
* 2026-01-24 - Bugfix "rebuild" command
|
|
@@ -304,9 +310,6 @@ Overview of main changes:
|
|
|
304
310
|
* 2026-01-22 - rebuid command: skip hashing same files by check the inode uniqueness
|
|
305
311
|
* 2026-01-22 - Add "fs-info" in dev cli
|
|
306
312
|
* 2026-01-22 - rebuild command: fix wrong progress bar
|
|
307
|
-
|
|
308
|
-
<details><summary>Expand older history entries ...</summary>
|
|
309
|
-
|
|
310
313
|
* [v1.8.0](https://github.com/jedie/PyHardLinkBackup/compare/v1.7.3...v1.8.0)
|
|
311
314
|
* 2026-01-22 - Add optional "--name" to enforce a name for the backup sub directory
|
|
312
315
|
* 2026-01-22 - Do not cross filesystem boundaries as default
|
|
@@ -36,13 +36,18 @@ Notes:
|
|
|
36
36
|
* The "relative path" that will be stored is not validated, so it can be any string.
|
|
37
37
|
* We don't "cache" anything in Memory, to avoid high memory consumption for large datasets.
|
|
38
38
|
|
|
39
|
+
The entry for each hash is always updated to point to the most recently backed-up file.
|
|
40
|
+
This means you can safely delete old backups: the hash DB will still point to a valid
|
|
41
|
+
file in the most recent backup, so deduplication continues to work correctly.
|
|
42
|
+
|
|
39
43
|
## FileHashDatabase - Missing hardlink target file
|
|
40
44
|
|
|
41
|
-
|
|
42
|
-
|
|
45
|
+
Deleting files from old backups is safe: the hash DB entry always points to the
|
|
46
|
+
most recently backed-up file, so subsequent backups can still create hardlinks.
|
|
43
47
|
|
|
44
|
-
|
|
45
|
-
|
|
48
|
+
The `get()` method checks whether the referenced file still exists.
|
|
49
|
+
If not, the stale entry is removed and a warning is logged.
|
|
50
|
+
On the next backup run, the file is then copied fresh instead of hardlinked.
|
|
46
51
|
|
|
47
52
|
## FileSizeDatabase
|
|
48
53
|
|
|
@@ -9,7 +9,7 @@ authors = [
|
|
|
9
9
|
]
|
|
10
10
|
requires-python = ">=3.12"
|
|
11
11
|
dependencies = [
|
|
12
|
-
"cli-base-utilities
|
|
12
|
+
"cli-base-utilities", # https://github.com/jedie/cli-base-utilities
|
|
13
13
|
"bx_py_utils", # https://github.com/boxine/bx_py_utils
|
|
14
14
|
"tyro", # https://github.com/brentyi/tyro
|
|
15
15
|
"rich", # https://github.com/Textualize/rich
|
|
@@ -43,8 +43,9 @@ exclude-newer = "1 week"
|
|
|
43
43
|
[tool.uv.exclude-newer-package]
|
|
44
44
|
# Exclude own packages from the "exclude-newer" rule and
|
|
45
45
|
# add external packages temporarily to fix known issues or current CVEs
|
|
46
|
+
uv = "2026-04-13T12:00:00Z"
|
|
47
|
+
cli-base-utilities = "2026-04-13T12:00:00Z"
|
|
46
48
|
cryptography = "2026-04-08T12:00:00Z"
|
|
47
|
-
django = "2026-04-08T12:00:00Z"
|
|
48
49
|
|
|
49
50
|
|
|
50
51
|
[tool.cli_base.pip_audit]
|
|
@@ -3,11 +3,12 @@ revision = 3
|
|
|
3
3
|
requires-python = ">=3.12"
|
|
4
4
|
|
|
5
5
|
[options]
|
|
6
|
-
exclude-newer = "2026-04-
|
|
6
|
+
exclude-newer = "2026-04-07T13:11:37.779330069Z"
|
|
7
7
|
exclude-newer-span = "P1W"
|
|
8
8
|
|
|
9
9
|
[options.exclude-newer-package]
|
|
10
|
-
|
|
10
|
+
uv = "2026-04-13T12:00:00Z"
|
|
11
|
+
cli-base-utilities = "2026-04-13T12:00:00Z"
|
|
11
12
|
cryptography = "2026-04-08T12:00:00Z"
|
|
12
13
|
|
|
13
14
|
[[package]]
|
|
@@ -208,7 +209,7 @@ wheels = [
|
|
|
208
209
|
|
|
209
210
|
[[package]]
|
|
210
211
|
name = "cli-base-utilities"
|
|
211
|
-
version = "0.
|
|
212
|
+
version = "0.30.0"
|
|
212
213
|
source = { registry = "https://pypi.org/simple" }
|
|
213
214
|
dependencies = [
|
|
214
215
|
{ name = "bx-py-utils" },
|
|
@@ -218,21 +219,21 @@ dependencies = [
|
|
|
218
219
|
{ name = "tomlkit" },
|
|
219
220
|
{ name = "tyro" },
|
|
220
221
|
]
|
|
221
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
222
|
+
sdist = { url = "https://files.pythonhosted.org/packages/d5/f5/93c8df59459440ef34e24812a5d7e76aea445b8966b777b9ca7174f8ca44/cli_base_utilities-0.30.0.tar.gz", hash = "sha256:a27966515c61604f1cdce5ab221d6c8f92a85f36e7426091fb2cb40d61f109e5", size = 156201, upload-time = "2026-04-11T10:50:14.473Z" }
|
|
222
223
|
wheels = [
|
|
223
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
224
|
+
{ url = "https://files.pythonhosted.org/packages/c4/7f/656f57ac19564b759729b0ff94dcbca5bfd9a53fe0a15633c4fd523117fb/cli_base_utilities-0.30.0-py3-none-any.whl", hash = "sha256:7952a5bfc667e2c974e3215ad3c4e52e785d338f7f9ab2bc4678d2f70c6c2574", size = 107684, upload-time = "2026-04-11T10:50:12.664Z" },
|
|
224
225
|
]
|
|
225
226
|
|
|
226
227
|
[[package]]
|
|
227
228
|
name = "click"
|
|
228
|
-
version = "8.3.
|
|
229
|
+
version = "8.3.2"
|
|
229
230
|
source = { registry = "https://pypi.org/simple" }
|
|
230
231
|
dependencies = [
|
|
231
232
|
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
|
232
233
|
]
|
|
233
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
234
|
+
sdist = { url = "https://files.pythonhosted.org/packages/57/75/31212c6bf2503fdf920d87fee5d7a86a2e3bcf444984126f13d8e4016804/click-8.3.2.tar.gz", hash = "sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5", size = 302856, upload-time = "2026-04-03T19:14:45.118Z" }
|
|
234
235
|
wheels = [
|
|
235
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
236
|
+
{ url = "https://files.pythonhosted.org/packages/e4/20/71885d8b97d4f3dde17b1fdb92dbd4908b00541c5a3379787137285f602e/click-8.3.2-py3-none-any.whl", hash = "sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d", size = 108379, upload-time = "2026-04-03T19:14:43.505Z" },
|
|
236
237
|
]
|
|
237
238
|
|
|
238
239
|
[[package]]
|
|
@@ -803,11 +804,11 @@ wheels = [
|
|
|
803
804
|
|
|
804
805
|
[[package]]
|
|
805
806
|
name = "more-itertools"
|
|
806
|
-
version = "11.0.
|
|
807
|
+
version = "11.0.1"
|
|
807
808
|
source = { registry = "https://pypi.org/simple" }
|
|
808
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
809
|
+
sdist = { url = "https://files.pythonhosted.org/packages/24/24/e0acc4bf54cba50c1d432c70a72a3df96db4a321b2c4c68432a60759044f/more_itertools-11.0.1.tar.gz", hash = "sha256:fefaf25b7ab08f0b45fa9f1892cae93b9fc0089ef034d39213bce15f1cc9e199", size = 144739, upload-time = "2026-04-02T16:17:45.061Z" }
|
|
809
810
|
wheels = [
|
|
810
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
811
|
+
{ url = "https://files.pythonhosted.org/packages/d8/f4/5e52c7319b8087acef603ed6e50dc325c02eaa999355414830468611f13c/more_itertools-11.0.1-py3-none-any.whl", hash = "sha256:eaf287826069452a8f61026c597eae2428b2d1ba2859083abbf240b46842ce6d", size = 72182, upload-time = "2026-04-02T16:17:43.724Z" },
|
|
811
812
|
]
|
|
812
813
|
|
|
813
814
|
[[package]]
|
|
@@ -1146,7 +1147,7 @@ dev = [
|
|
|
1146
1147
|
[package.metadata]
|
|
1147
1148
|
requires-dist = [
|
|
1148
1149
|
{ name = "bx-py-utils" },
|
|
1149
|
-
{ name = "cli-base-utilities"
|
|
1150
|
+
{ name = "cli-base-utilities" },
|
|
1150
1151
|
{ name = "rich" },
|
|
1151
1152
|
{ name = "tyro" },
|
|
1152
1153
|
]
|
|
@@ -1337,27 +1338,27 @@ wheels = [
|
|
|
1337
1338
|
|
|
1338
1339
|
[[package]]
|
|
1339
1340
|
name = "ruff"
|
|
1340
|
-
version = "0.15.
|
|
1341
|
-
source = { registry = "https://pypi.org/simple" }
|
|
1342
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1343
|
-
wheels = [
|
|
1344
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1345
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1346
|
-
{ url = "https://files.pythonhosted.org/packages/ca/
|
|
1347
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1348
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1349
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1350
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1351
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1352
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1353
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1354
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1355
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1356
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1357
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1358
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1359
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1360
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1341
|
+
version = "0.15.9"
|
|
1342
|
+
source = { registry = "https://pypi.org/simple" }
|
|
1343
|
+
sdist = { url = "https://files.pythonhosted.org/packages/e6/97/e9f1ca355108ef7194e38c812ef40ba98c7208f47b13ad78d023caa583da/ruff-0.15.9.tar.gz", hash = "sha256:29cbb1255a9797903f6dde5ba0188c707907ff44a9006eb273b5a17bfa0739a2", size = 4617361, upload-time = "2026-04-02T18:17:20.829Z" }
|
|
1344
|
+
wheels = [
|
|
1345
|
+
{ url = "https://files.pythonhosted.org/packages/0b/1f/9cdfd0ac4b9d1e5a6cf09bedabdf0b56306ab5e333c85c87281273e7b041/ruff-0.15.9-py3-none-linux_armv6l.whl", hash = "sha256:6efbe303983441c51975c243e26dff328aca11f94b70992f35b093c2e71801e1", size = 10511206, upload-time = "2026-04-02T18:16:41.574Z" },
|
|
1346
|
+
{ url = "https://files.pythonhosted.org/packages/3d/f6/32bfe3e9c136b35f02e489778d94384118bb80fd92c6d92e7ccd97db12ce/ruff-0.15.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:4965bac6ac9ea86772f4e23587746f0b7a395eccabb823eb8bfacc3fa06069f7", size = 10923307, upload-time = "2026-04-02T18:17:08.645Z" },
|
|
1347
|
+
{ url = "https://files.pythonhosted.org/packages/ca/25/de55f52ab5535d12e7aaba1de37a84be6179fb20bddcbe71ec091b4a3243/ruff-0.15.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eaf05aad70ca5b5a0a4b0e080df3a6b699803916d88f006efd1f5b46302daab8", size = 10316722, upload-time = "2026-04-02T18:16:44.206Z" },
|
|
1348
|
+
{ url = "https://files.pythonhosted.org/packages/48/11/690d75f3fd6278fe55fff7c9eb429c92d207e14b25d1cae4064a32677029/ruff-0.15.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9439a342adb8725f32f92732e2bafb6d5246bd7a5021101166b223d312e8fc59", size = 10623674, upload-time = "2026-04-02T18:16:50.951Z" },
|
|
1349
|
+
{ url = "https://files.pythonhosted.org/packages/bd/ec/176f6987be248fc5404199255522f57af1b4a5a1b57727e942479fec98ad/ruff-0.15.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c5e6faf9d97c8edc43877c3f406f47446fc48c40e1442d58cfcdaba2acea745", size = 10351516, upload-time = "2026-04-02T18:16:57.206Z" },
|
|
1350
|
+
{ url = "https://files.pythonhosted.org/packages/b2/fc/51cffbd2b3f240accc380171d51446a32aa2ea43a40d4a45ada67368fbd2/ruff-0.15.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b34a9766aeec27a222373d0b055722900fbc0582b24f39661aa96f3fe6ad901", size = 11150202, upload-time = "2026-04-02T18:17:06.452Z" },
|
|
1351
|
+
{ url = "https://files.pythonhosted.org/packages/d6/d4/25292a6dfc125f6b6528fe6af31f5e996e19bf73ca8e3ce6eb7fa5b95885/ruff-0.15.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89dd695bc72ae76ff484ae54b7e8b0f6b50f49046e198355e44ea656e521fef9", size = 11988891, upload-time = "2026-04-02T18:17:18.575Z" },
|
|
1352
|
+
{ url = "https://files.pythonhosted.org/packages/13/e1/1eebcb885c10e19f969dcb93d8413dfee8172578709d7ee933640f5e7147/ruff-0.15.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce187224ef1de1bd225bc9a152ac7102a6171107f026e81f317e4257052916d5", size = 11480576, upload-time = "2026-04-02T18:16:52.986Z" },
|
|
1353
|
+
{ url = "https://files.pythonhosted.org/packages/ff/6b/a1548ac378a78332a4c3dcf4a134c2475a36d2a22ddfa272acd574140b50/ruff-0.15.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b0c7c341f68adb01c488c3b7d4b49aa8ea97409eae6462d860a79cf55f431b6", size = 11254525, upload-time = "2026-04-02T18:17:02.041Z" },
|
|
1354
|
+
{ url = "https://files.pythonhosted.org/packages/42/aa/4bb3af8e61acd9b1281db2ab77e8b2c3c5e5599bf2a29d4a942f1c62b8d6/ruff-0.15.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:55cc15eee27dc0eebdfcb0d185a6153420efbedc15eb1d38fe5e685657b0f840", size = 11204072, upload-time = "2026-04-02T18:17:13.581Z" },
|
|
1355
|
+
{ url = "https://files.pythonhosted.org/packages/69/48/d550dc2aa6e423ea0bcc1d0ff0699325ffe8a811e2dba156bd80750b86dc/ruff-0.15.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a6537f6eed5cda688c81073d46ffdfb962a5f29ecb6f7e770b2dc920598997ed", size = 10594998, upload-time = "2026-04-02T18:16:46.369Z" },
|
|
1356
|
+
{ url = "https://files.pythonhosted.org/packages/63/47/321167e17f5344ed5ec6b0aa2cff64efef5f9e985af8f5622cfa6536043f/ruff-0.15.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:6d3fcbca7388b066139c523bda744c822258ebdcfbba7d24410c3f454cc9af71", size = 10359769, upload-time = "2026-04-02T18:17:10.994Z" },
|
|
1357
|
+
{ url = "https://files.pythonhosted.org/packages/67/5e/074f00b9785d1d2c6f8c22a21e023d0c2c1817838cfca4c8243200a1fa87/ruff-0.15.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:058d8e99e1bfe79d8a0def0b481c56059ee6716214f7e425d8e737e412d69677", size = 10850236, upload-time = "2026-04-02T18:16:48.749Z" },
|
|
1358
|
+
{ url = "https://files.pythonhosted.org/packages/76/37/804c4135a2a2caf042925d30d5f68181bdbd4461fd0d7739da28305df593/ruff-0.15.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8e1ddb11dbd61d5983fa2d7d6370ef3eb210951e443cace19594c01c72abab4c", size = 11358343, upload-time = "2026-04-02T18:16:55.068Z" },
|
|
1359
|
+
{ url = "https://files.pythonhosted.org/packages/88/3d/1364fcde8656962782aa9ea93c92d98682b1ecec2f184e625a965ad3b4a6/ruff-0.15.9-py3-none-win32.whl", hash = "sha256:bde6ff36eaf72b700f32b7196088970bf8fdb2b917b7accd8c371bfc0fd573ec", size = 10583382, upload-time = "2026-04-02T18:17:04.261Z" },
|
|
1360
|
+
{ url = "https://files.pythonhosted.org/packages/4c/56/5c7084299bd2cacaa07ae63a91c6f4ba66edc08bf28f356b24f6b717c799/ruff-0.15.9-py3-none-win_amd64.whl", hash = "sha256:45a70921b80e1c10cf0b734ef09421f71b5aa11d27404edc89d7e8a69505e43d", size = 11744969, upload-time = "2026-04-02T18:16:59.611Z" },
|
|
1361
|
+
{ url = "https://files.pythonhosted.org/packages/03/36/76704c4f312257d6dbaae3c959add2a622f63fcca9d864659ce6d8d97d3d/ruff-0.15.9-py3-none-win_arm64.whl", hash = "sha256:0694e601c028fd97dc5c6ee244675bc241aeefced7ef80cd9c6935a871078f53", size = 11005870, upload-time = "2026-04-02T18:17:15.773Z" },
|
|
1361
1362
|
]
|
|
1362
1363
|
|
|
1363
1364
|
[[package]]
|
|
@@ -1503,26 +1504,26 @@ wheels = [
|
|
|
1503
1504
|
|
|
1504
1505
|
[[package]]
|
|
1505
1506
|
name = "ty"
|
|
1506
|
-
version = "0.0.
|
|
1507
|
+
version = "0.0.29"
|
|
1507
1508
|
source = { registry = "https://pypi.org/simple" }
|
|
1508
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1509
|
+
sdist = { url = "https://files.pythonhosted.org/packages/47/d5/853561de49fae38c519e905b2d8da9c531219608f1fccc47a0fc2c896980/ty-0.0.29.tar.gz", hash = "sha256:e7936cca2f691eeda631876c92809688dbbab68687c3473f526cd83b6a9228d8", size = 5469221, upload-time = "2026-04-05T15:01:21.328Z" }
|
|
1509
1510
|
wheels = [
|
|
1510
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1511
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1512
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1513
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1514
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1515
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1516
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1517
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1518
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1519
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1520
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1521
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1522
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1523
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1524
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1525
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1511
|
+
{ url = "https://files.pythonhosted.org/packages/03/b7/911f9962115acfa24e3b2ec9d4992dd994c38e8769e1b1d7680bb4d28a51/ty-0.0.29-py3-none-linux_armv6l.whl", hash = "sha256:b8a40955f7660d3eaceb0d964affc81b790c0765e7052921a5f861ff8a471c30", size = 10568206, upload-time = "2026-04-05T15:01:19.165Z" },
|
|
1512
|
+
{ url = "https://files.pythonhosted.org/packages/fe/c3/fcae2167d4c77a97269f92f11d1b43b03617f81de1283d5d05b43432110c/ty-0.0.29-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6b6849adae15b00bbe2d3c5b078967dcb62eba37d38936b8eeb4c81a82d2e3b8", size = 10442530, upload-time = "2026-04-05T15:01:28.471Z" },
|
|
1513
|
+
{ url = "https://files.pythonhosted.org/packages/97/33/5a6bfa240cfcb9c36046ae2459fa9ea23238d20130d8656ff5ac4d6c012a/ty-0.0.29-py3-none-macosx_11_0_arm64.whl", hash = "sha256:dcdd9b17209788152f7b7ea815eda07989152325052fe690013537cc7904ce49", size = 9915735, upload-time = "2026-04-05T15:01:10.365Z" },
|
|
1514
|
+
{ url = "https://files.pythonhosted.org/packages/b3/1e/318f45fae232118e81a6306c30f50de42c509c412128d5bd231eab699ffb/ty-0.0.29-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d8ed4789bae78ffaf94462c0d25589a734cab0366b86f2bbcb1bb90e1a7a169", size = 10419748, upload-time = "2026-04-05T15:01:32.375Z" },
|
|
1515
|
+
{ url = "https://files.pythonhosted.org/packages/a9/a8/5687872e2ab5a0f7dd4fd8456eac31e9381ad4dc74961f6f29965ad4dd91/ty-0.0.29-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91ec374b8565e0ad0900011c24641ebbef2da51adbd4fb69ff3280c8a7eceb02", size = 10394738, upload-time = "2026-04-05T15:01:06.473Z" },
|
|
1516
|
+
{ url = "https://files.pythonhosted.org/packages/de/68/015d118097eeb95e6a44c4abce4c0a28b7b9dfb3085b7f0ee48e4f099633/ty-0.0.29-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:298a8d5faa2502d3810bbbb47a030b9455495b9921594206043c785dd61548cf", size = 10910613, upload-time = "2026-04-05T15:01:17.17Z" },
|
|
1517
|
+
{ url = "https://files.pythonhosted.org/packages/1c/01/47ce3c6c53e0670eadbe80756b167bf80ed6681d1ba57cfde2e8065a13d1/ty-0.0.29-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c8fba1a3524c6109d1e020d92301c79d41bf442fa8d335b9fa366239339cb70", size = 11475750, upload-time = "2026-04-05T15:01:30.461Z" },
|
|
1518
|
+
{ url = "https://files.pythonhosted.org/packages/c4/cf/e361845b1081c9264ad5b7c963231bab03f2666865a9f2a115c4233f2137/ty-0.0.29-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c48adf88a70d264128c39ee922ed14a947817fced1e93c08c1a89c9244edcde", size = 11190055, upload-time = "2026-04-05T15:01:12.369Z" },
|
|
1519
|
+
{ url = "https://files.pythonhosted.org/packages/79/12/0fb0857e9a62cb11586e9a712103877bbf717f5fb570d16634408cfdefee/ty-0.0.29-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ce0a7a0e96bc7b42518cd3a1a6a6298ef64ff40ca4614355c1aa807059b5c6f", size = 11020539, upload-time = "2026-04-05T15:01:37.022Z" },
|
|
1520
|
+
{ url = "https://files.pythonhosted.org/packages/20/36/5a26753802083f80cd125db6c4348ad42b3c982ec36e718e0bf4c18f75e5/ty-0.0.29-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a6ac86a05b4a3731d45365ab97780acc7b8146fa62fccb3cbe94fe6546c67a97", size = 10396399, upload-time = "2026-04-05T15:01:26.167Z" },
|
|
1521
|
+
{ url = "https://files.pythonhosted.org/packages/00/e6/b4e75b5752239ab3ab400f19faef4dbef81d05aab5d3419fda0c062a3765/ty-0.0.29-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:6bbbf53141af0f3150bf288d716263f1a3550054e4b3551ca866d38192ba9891", size = 10421461, upload-time = "2026-04-05T15:01:08.367Z" },
|
|
1522
|
+
{ url = "https://files.pythonhosted.org/packages/c0/21/1084b5b609f9abed62070ec0b31c283a403832a6310c8bbc208bd45ee1e6/ty-0.0.29-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1c9e06b770c1d0ff5efc51e34312390db31d53fcf3088163f413030b42b74f84", size = 10599187, upload-time = "2026-04-05T15:01:23.52Z" },
|
|
1523
|
+
{ url = "https://files.pythonhosted.org/packages/ab/a1/ce19a2ca717bbcc1ee11378aba52ef70b6ce5b87245162a729d9fdc2360f/ty-0.0.29-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0307fe37e3f000ef1a4ae230bbaf511508a78d24a5e51b40902a21b09d5e6037", size = 11121198, upload-time = "2026-04-05T15:01:15.22Z" },
|
|
1524
|
+
{ url = "https://files.pythonhosted.org/packages/6b/6b/f1430b279af704321566ce7ec2725d3d8258c2f815ebd93e474c64cd4543/ty-0.0.29-py3-none-win32.whl", hash = "sha256:7a2a898217960a825f8bc0087e1fdbaf379606175e98f9807187221d53a4a8ed", size = 9995331, upload-time = "2026-04-05T15:01:01.32Z" },
|
|
1525
|
+
{ url = "https://files.pythonhosted.org/packages/d2/ef/3ef01c17785ff9a69378465c7d0faccd48a07b163554db0995e5d65a5a23/ty-0.0.29-py3-none-win_amd64.whl", hash = "sha256:fc1294200226b91615acbf34e0a9ad81caf98c081e9c6a912a31b0a7b603bc3f", size = 11023644, upload-time = "2026-04-05T15:01:04.432Z" },
|
|
1526
|
+
{ url = "https://files.pythonhosted.org/packages/2c/55/87280a994d6a2d2647c65e12abbc997ed49835794366153c04c4d9304d76/ty-0.0.29-py3-none-win_arm64.whl", hash = "sha256:f9794bbd1bb3ce13f78c191d0c89ae4c63f52c12b6daa0c6fe220b90d019d12c", size = 10428165, upload-time = "2026-04-05T15:01:34.665Z" },
|
|
1526
1527
|
]
|
|
1527
1528
|
|
|
1528
1529
|
[[package]]
|
|
@@ -1562,11 +1563,11 @@ wheels = [
|
|
|
1562
1563
|
|
|
1563
1564
|
[[package]]
|
|
1564
1565
|
name = "tzdata"
|
|
1565
|
-
version = "
|
|
1566
|
+
version = "2026.1"
|
|
1566
1567
|
source = { registry = "https://pypi.org/simple" }
|
|
1567
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1568
|
+
sdist = { url = "https://files.pythonhosted.org/packages/19/f5/cd531b2d15a671a40c0f66cf06bc3570a12cd56eef98960068ebbad1bf5a/tzdata-2026.1.tar.gz", hash = "sha256:67658a1903c75917309e753fdc349ac0efd8c27db7a0cb406a25be4840f87f98", size = 197639, upload-time = "2026-04-03T11:25:22.002Z" }
|
|
1568
1569
|
wheels = [
|
|
1569
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1570
|
+
{ url = "https://files.pythonhosted.org/packages/b0/70/d460bd685a170790ec89317e9bd33047988e4bce507b831f5db771e142de/tzdata-2026.1-py2.py3-none-any.whl", hash = "sha256:4b1d2be7ac37ceafd7327b961aa3a54e467efbdb563a23655fbfe0d39cfc42a9", size = 348952, upload-time = "2026-04-03T11:25:20.313Z" },
|
|
1570
1571
|
]
|
|
1571
1572
|
|
|
1572
1573
|
[[package]]
|
|
@@ -1580,28 +1581,28 @@ wheels = [
|
|
|
1580
1581
|
|
|
1581
1582
|
[[package]]
|
|
1582
1583
|
name = "uv"
|
|
1583
|
-
version = "0.11.
|
|
1584
|
-
source = { registry = "https://pypi.org/simple" }
|
|
1585
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1586
|
-
wheels = [
|
|
1587
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1588
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1589
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1590
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1591
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1592
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1593
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1594
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1595
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1596
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1597
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1598
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1599
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1600
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1601
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1602
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1603
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1604
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1584
|
+
version = "0.11.6"
|
|
1585
|
+
source = { registry = "https://pypi.org/simple" }
|
|
1586
|
+
sdist = { url = "https://files.pythonhosted.org/packages/dd/f3/8aceeab67ea69805293ab290e7ca8cc1b61a064d28b8a35c76d8eba063dd/uv-0.11.6.tar.gz", hash = "sha256:e3b21b7e80024c95ff339fcd147ac6fc3dd98d3613c9d45d3a1f4fd1057f127b", size = 4073298, upload-time = "2026-04-09T12:09:01.738Z" }
|
|
1587
|
+
wheels = [
|
|
1588
|
+
{ url = "https://files.pythonhosted.org/packages/1f/fe/4b61a3d5ad9d02e8a4405026ccd43593d7044598e0fa47d892d4dafe44c9/uv-0.11.6-py3-none-linux_armv6l.whl", hash = "sha256:ada04dcf89ddea5b69d27ac9cdc5ef575a82f90a209a1392e930de504b2321d6", size = 23780079, upload-time = "2026-04-09T12:08:56.609Z" },
|
|
1589
|
+
{ url = "https://files.pythonhosted.org/packages/52/db/d27519a9e1a5ffee9d71af1a811ad0e19ce7ab9ae815453bef39dd479389/uv-0.11.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5be013888420f96879c6e0d3081e7bcf51b539b034a01777041934457dfbedf3", size = 23214721, upload-time = "2026-04-09T12:09:32.228Z" },
|
|
1590
|
+
{ url = "https://files.pythonhosted.org/packages/a6/8f/4399fa8b882bd7e0efffc829f73ab24d117d490a93e6bc7104a50282b854/uv-0.11.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ffa5dc1cbb52bdce3b8447e83d1601a57ad4da6b523d77d4b47366db8b1ceb18", size = 21750109, upload-time = "2026-04-09T12:09:24.357Z" },
|
|
1591
|
+
{ url = "https://files.pythonhosted.org/packages/32/07/5a12944c31c3dda253632da7a363edddb869ed47839d4d92a2dc5f546c93/uv-0.11.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:bfb107b4dade1d2c9e572992b06992d51dd5f2136eb8ceee9e62dd124289e825", size = 23551146, upload-time = "2026-04-09T12:09:10.439Z" },
|
|
1592
|
+
{ url = "https://files.pythonhosted.org/packages/79/5b/2ec8b0af80acd1016ed596baf205ddc77b19ece288473b01926c4a9cf6db/uv-0.11.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:9e2fe7ce12161d8016b7deb1eaad7905a76ff7afec13383333ca75e0c4b5425d", size = 23331192, upload-time = "2026-04-09T12:09:34.792Z" },
|
|
1593
|
+
{ url = "https://files.pythonhosted.org/packages/62/7d/eea35935f2112b21c296a3e42645f3e4b1aa8bcd34dcf13345fbd55134b7/uv-0.11.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ed9c6f70c25e8dfeedddf4eddaf14d353f5e6b0eb43da9a14d3a1033d51d915", size = 23337686, upload-time = "2026-04-09T12:09:18.522Z" },
|
|
1594
|
+
{ url = "https://files.pythonhosted.org/packages/21/47/2584f5ab618f6ebe9bdefb2f765f2ca8540e9d739667606a916b35449eec/uv-0.11.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d68a013e609cebf82077cbeeb0809ed5e205257814273bfd31e02fc0353bbfc2", size = 25008139, upload-time = "2026-04-09T12:09:03.983Z" },
|
|
1595
|
+
{ url = "https://files.pythonhosted.org/packages/95/81/497ae5c1d36355b56b97dc59f550c7e89d0291c163a3f203c6f341dff195/uv-0.11.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93f736dddca03dae732c6fdea177328d3bc4bf137c75248f3d433c57416a4311", size = 25712458, upload-time = "2026-04-09T12:09:07.598Z" },
|
|
1596
|
+
{ url = "https://files.pythonhosted.org/packages/3c/1c/74083238e4fab2672b63575b9008f1ea418b02a714bcfcf017f4f6a309b6/uv-0.11.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e96a66abe53fced0e3389008b8d2eff8278cfa8bb545d75631ae8ceb9c929aba", size = 24915507, upload-time = "2026-04-09T12:08:50.892Z" },
|
|
1597
|
+
{ url = "https://files.pythonhosted.org/packages/5a/ee/e14fe10ba455a823ed18233f12de6699a601890905420b5c504abf115116/uv-0.11.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b096311b2743b228df911a19532b3f18fa420bf9530547aecd6a8e04bbfaccd", size = 24971011, upload-time = "2026-04-09T12:08:54.016Z" },
|
|
1598
|
+
{ url = "https://files.pythonhosted.org/packages/3c/a1/7b9c83eaadf98e343317ff6384a7227a4855afd02cdaf9696bcc71ee6155/uv-0.11.6-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:904d537b4a6e798015b4a64ff5622023bd4601b43b6cd1e5f423d63471f5e948", size = 23640234, upload-time = "2026-04-09T12:09:15.735Z" },
|
|
1599
|
+
{ url = "https://files.pythonhosted.org/packages/d6/51/75ccdd23e76ff1703b70eb82881cd5b4d2a954c9679f8ef7e0136ef2cfab/uv-0.11.6-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:4ed8150c26b5e319381d75ae2ce6aba1e9c65888f4850f4e3b3fa839953c90a5", size = 24452664, upload-time = "2026-04-09T12:09:26.875Z" },
|
|
1600
|
+
{ url = "https://files.pythonhosted.org/packages/4d/86/ace80fe47d8d48b5e3b5aee0b6eb1a49deaacc2313782870250b3faa36f5/uv-0.11.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1c9218c8d4ac35ca6e617fb0951cc0ab2d907c91a6aea2617de0a5494cf162c0", size = 24494599, upload-time = "2026-04-09T12:09:37.368Z" },
|
|
1601
|
+
{ url = "https://files.pythonhosted.org/packages/05/2d/4b642669b56648194f026de79bc992cbfc3ac2318b0a8d435f3c284934e8/uv-0.11.6-py3-none-musllinux_1_1_i686.whl", hash = "sha256:9e211c83cc890c569b86a4183fcf5f8b6f0c7adc33a839b699a98d30f1310d3a", size = 24159150, upload-time = "2026-04-09T12:09:13.17Z" },
|
|
1602
|
+
{ url = "https://files.pythonhosted.org/packages/ae/24/7eecd76fe983a74fed1fc700a14882e70c4e857f1d562a9f2303d4286c12/uv-0.11.6-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:d2a1d2089afdf117ad19a4c1dd36b8189c00ae1ad4135d3bfbfced82342595cf", size = 25164324, upload-time = "2026-04-09T12:08:59.56Z" },
|
|
1603
|
+
{ url = "https://files.pythonhosted.org/packages/27/e0/bbd4ba7c2e5067bbba617d87d306ec146889edaeeaa2081d3e122178ca08/uv-0.11.6-py3-none-win32.whl", hash = "sha256:6e8344f38fa29f85dcfd3e62dc35a700d2448f8e90381077ef393438dcd5012e", size = 22865693, upload-time = "2026-04-09T12:09:21.415Z" },
|
|
1604
|
+
{ url = "https://files.pythonhosted.org/packages/a5/33/1983ce113c538a856f2d620d16e39691962ecceef091a84086c5785e32e5/uv-0.11.6-py3-none-win_amd64.whl", hash = "sha256:a28bea69c1186303d1200f155c7a28c449f8a4431e458fcf89360cc7ef546e40", size = 25371258, upload-time = "2026-04-09T12:09:40.52Z" },
|
|
1605
|
+
{ url = "https://files.pythonhosted.org/packages/35/01/be0873f44b9c9bc250fcbf263367fcfc1f59feab996355bcb6b52fff080d/uv-0.11.6-py3-none-win_arm64.whl", hash = "sha256:a78f6d64b9950e24061bc7ec7f15ff8089ad7f5a976e7b65fcadce58fe02f613", size = 23869585, upload-time = "2026-04-09T12:09:29.425Z" },
|
|
1605
1606
|
]
|
|
1606
1607
|
|
|
1607
1608
|
[[package]]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/cli_dev/update_readme_history.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/tests/test_compare_backup.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/tests/test_readme_history.py
RENAMED
|
File without changes
|
{pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/tests/test_rebuild_database.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/file_size_database.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/tests/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyhardlinkbackup-1.8.4 → pyhardlinkbackup-1.9.0}/PyHardLinkBackup/utilities/tyro_cli_shared_args.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|