FileBackup 0.4.1__tar.gz → 0.4.3__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.
Files changed (55) hide show
  1. {filebackup-0.4.1 → filebackup-0.4.3}/.github/actions/release_impl/action.yml +6 -2
  2. {filebackup-0.4.1 → filebackup-0.4.3}/.github/workflows/CICD_impl.yml +83 -1
  3. {filebackup-0.4.1 → filebackup-0.4.3}/.gitignore +1 -0
  4. filebackup-0.4.3/BuildBinary.py +120 -0
  5. {filebackup-0.4.1 → filebackup-0.4.3}/PKG-INFO +2 -3
  6. {filebackup-0.4.1 → filebackup-0.4.3}/pyproject.toml +4 -4
  7. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/Offsite.py +3 -3
  8. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/__init__.py +1 -1
  9. {filebackup-0.4.1 → filebackup-0.4.3}/tests/Offsite_UnitTest.py +44 -1
  10. {filebackup-0.4.1 → filebackup-0.4.3}/uv.lock +190 -0
  11. {filebackup-0.4.1 → filebackup-0.4.3}/.copier-answers.yml +0 -0
  12. {filebackup-0.4.1 → filebackup-0.4.3}/.github/CODEOWNERS +0 -0
  13. {filebackup-0.4.1 → filebackup-0.4.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  14. {filebackup-0.4.1 → filebackup-0.4.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  15. {filebackup-0.4.1 → filebackup-0.4.3}/.github/ISSUE_TEMPLATE/custom.md +0 -0
  16. {filebackup-0.4.1 → filebackup-0.4.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  17. {filebackup-0.4.1 → filebackup-0.4.3}/.github/pull_request_template.md +0 -0
  18. {filebackup-0.4.1 → filebackup-0.4.3}/.github/release_sources.yaml +0 -0
  19. {filebackup-0.4.1 → filebackup-0.4.3}/.github/workflows/CICD.yml +0 -0
  20. {filebackup-0.4.1 → filebackup-0.4.3}/.github/workflows/codeql.yml +0 -0
  21. {filebackup-0.4.1 → filebackup-0.4.3}/.pre-commit-config.yaml +0 -0
  22. {filebackup-0.4.1 → filebackup-0.4.3}/.python-version +0 -0
  23. {filebackup-0.4.1 → filebackup-0.4.3}/CODE_OF_CONDUCT.md +0 -0
  24. {filebackup-0.4.1 → filebackup-0.4.3}/CONTRIBUTING.md +0 -0
  25. {filebackup-0.4.1 → filebackup-0.4.3}/DEVELOPMENT.md +0 -0
  26. {filebackup-0.4.1 → filebackup-0.4.3}/GOVERNANCE.md +0 -0
  27. {filebackup-0.4.1 → filebackup-0.4.3}/LICENSE +0 -0
  28. {filebackup-0.4.1 → filebackup-0.4.3}/MAINTAINERS.md +0 -0
  29. {filebackup-0.4.1 → filebackup-0.4.3}/README.md +0 -0
  30. {filebackup-0.4.1 → filebackup-0.4.3}/SECURITY.md +0 -0
  31. {filebackup-0.4.1 → filebackup-0.4.3}/minisign_key.pub +0 -0
  32. {filebackup-0.4.1 → filebackup-0.4.3}/src/AutoGitSemVer.yaml +0 -0
  33. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/CommandLine/CommandLineArguments.py +0 -0
  34. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/CommandLine/EntryPoint.py +0 -0
  35. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/CommandLine/MirrorEntryPoint.py +0 -0
  36. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/CommandLine/OffsiteEntryPoint.py +0 -0
  37. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/CommandLine/__init__.py +0 -0
  38. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/DataStore/FastGlacierDataStore.py +0 -0
  39. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/DataStore/FileSystemDataStore.py +0 -0
  40. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/DataStore/Interfaces/BulkStorageDataStore.py +0 -0
  41. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/DataStore/Interfaces/DataStore.py +0 -0
  42. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/DataStore/Interfaces/FileBasedDataStore.py +0 -0
  43. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/DataStore/Interfaces/__init__.py +0 -0
  44. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/DataStore/S3BrowserDataStore.py +0 -0
  45. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/DataStore/SFTPDataStore.py +0 -0
  46. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/DataStore/__init__.py +0 -0
  47. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/Impl/Common.py +0 -0
  48. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/Impl/__init__.py +0 -0
  49. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/Mirror.py +0 -0
  50. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/Snapshot.py +0 -0
  51. {filebackup-0.4.1 → filebackup-0.4.3}/src/FileBackup/py.typed +0 -0
  52. {filebackup-0.4.1 → filebackup-0.4.3}/tests/CommandLine/EntryPoint_UnitTest.py +0 -0
  53. {filebackup-0.4.1 → filebackup-0.4.3}/tests/Mirror_UnitTest.py +0 -0
  54. {filebackup-0.4.1 → filebackup-0.4.3}/tests/Snapshot_UnitTest.py +0 -0
  55. {filebackup-0.4.1 → filebackup-0.4.3}/tests/TestHelpers.py +0 -0
@@ -36,11 +36,15 @@ runs:
36
36
  with:
37
37
  enable-cache: false # No uv.lock or requirements.txt files, so nothing to cache on
38
38
 
39
- - name: Download Python Package
39
+ - name: Download Artifacts
40
40
  uses: actions/download-artifact@v4
41
41
  with:
42
- name: Python package
43
42
  path: dist
43
+ merge-multiple: true
44
+
45
+ - name: Remove Coverage Files Artifacts
46
+ shell: bash
47
+ run: rm dist/.coverage*
44
48
 
45
49
  # Create repository tag
46
50
  - name: Create Repository Tag
@@ -222,9 +222,91 @@ jobs:
222
222
  - name: Validate Python Package
223
223
  run: uv run python -c "import FileBackup as package; assert package.__version__ == '${{ env.PACKAGE_VERSION }}', package.__version__"
224
224
 
225
+ # ----------------------------------------------------------------------
226
+ build_binary:
227
+ needs: python_package
228
+
229
+ strategy:
230
+ fail-fast: false
231
+
232
+ matrix:
233
+ os: ${{ fromJson(inputs.operating_system_json_string) }}
234
+
235
+ name: Build Stand Alone Binary
236
+ runs-on: ${{ matrix.os }}
237
+
238
+ env:
239
+ PACKAGE_VERSION: ${{ needs.python_package.outputs.package_version }}
240
+
241
+ permissions:
242
+ contents: read
243
+
244
+ steps:
245
+ - uses: actions/checkout@v4
246
+
247
+ - name: Install uv and python
248
+ uses: astral-sh/setup-uv@v5
249
+ with:
250
+ python-version: ${{ inputs.python_package_version }}
251
+ enable-cache: true
252
+
253
+ - name: Build Binary
254
+ run: uv run python BuildBinary.py Build --verbose
255
+
256
+ - name: Bundle Binary
257
+ run: uv run python BuildBinary.py Bundle --custom-filename-suffix "-${{ env.PACKAGE_VERSION }}.${{ matrix.os }}" --verbose
258
+
259
+ - name: Upload Bundle
260
+ uses: actions/upload-artifact@v4
261
+ with:
262
+ name: Binary.${{ matrix.os }}
263
+ path: FileBackup-${{ env.PACKAGE_VERSION }}.*
264
+ validate_binary:
265
+ needs: [python_package, build_binary]
266
+
267
+ strategy:
268
+ fail-fast: false
269
+
270
+ matrix:
271
+ os: ${{ fromJson(inputs.operating_system_json_string) }}
272
+
273
+ name: Validate Stand Alone Binary
274
+ runs-on: ${{ matrix.os }}
275
+
276
+ env:
277
+ PACKAGE_VERSION: ${{ needs.python_package.outputs.package_version }}
278
+
279
+ permissions: {}
280
+
281
+ steps:
282
+ - name: Download Binary
283
+ uses: actions/download-artifact@v4
284
+ with:
285
+ name: Binary.${{ matrix.os }}
286
+ path: binary
287
+
288
+ - name: Unzip Archive (Windows)
289
+ if: ${{ startsWith(matrix.os, 'windows') }}
290
+ run: |-
291
+ cd binary
292
+ tar -xf FileBackup-${{ env.PACKAGE_VERSION }}.windows.zip
293
+
294
+ - name: Unzip Archive (Not Windows)
295
+ if: ${{ !startsWith(matrix.os, 'windows') }}
296
+ run: |-
297
+ cd binary
298
+
299
+ for file in ./*
300
+ do
301
+ tar -xvzf "$file"
302
+ done
303
+
304
+ - name: Validate Binary
305
+ run: binary/FileBackup version
306
+
225
307
  # ----------------------------------------------------------------------
226
308
  release:
227
- needs: [package_coverage, python_package, validate_python_package]
309
+ needs: [package_coverage, python_package, validate_python_package, validate_binary]
228
310
 
229
311
  name: Release
230
312
  runs-on: ubuntu-latest
@@ -4,3 +4,4 @@
4
4
  __pycache__
5
5
  minisign_key.pri
6
6
  post_generation_instructions.html
7
+ build/
@@ -0,0 +1,120 @@
1
+ import os
2
+ import shutil
3
+
4
+ from pathlib import Path
5
+ from typing import Annotated, Optional
6
+
7
+ import typer
8
+
9
+ from dbrownell_Common import SubprocessEx
10
+ from dbrownell_Common.Streams.DoneManager import DoneManager, Flags as DoneManagerFlags
11
+ from typer.core import TyperGroup
12
+
13
+
14
+ # ----------------------------------------------------------------------
15
+ class NaturalOrderGrouper(TyperGroup):
16
+ # pylint: disable=missing-class-docstring
17
+ # ----------------------------------------------------------------------
18
+ def list_commands(self, *args, **kwargs): # pylint: disable=unused-argument
19
+ return self.commands.keys()
20
+
21
+
22
+ # ----------------------------------------------------------------------
23
+ app = typer.Typer(
24
+ cls=NaturalOrderGrouper,
25
+ help=__doc__,
26
+ no_args_is_help=True,
27
+ pretty_exceptions_show_locals=False,
28
+ pretty_exceptions_enable=False,
29
+ )
30
+
31
+
32
+ # ----------------------------------------------------------------------
33
+ @app.command("Build", no_args_is_help=False)
34
+ def Build(
35
+ verbose: Annotated[
36
+ bool,
37
+ typer.Option("--verbose", help="Write verbose information to the terminal."),
38
+ ] = False,
39
+ debug: Annotated[
40
+ bool,
41
+ typer.Option("--debug", help="Write debug information to the terminal."),
42
+ ] = False,
43
+ ) -> None:
44
+ """Build a standalone binary for the application."""
45
+
46
+ with DoneManager.CreateCommandLine(
47
+ flags=DoneManagerFlags.Create(verbose=verbose, debug=debug),
48
+ ) as dm:
49
+ command_line = "cxfreeze --script src/FileBackup/CommandLine/EntryPoint.py --target-name=FileBackup"
50
+
51
+ dm.WriteVerbose(f"Command line: {command_line}\n\n")
52
+
53
+ with dm.YieldStream() as stream:
54
+ dm.result = SubprocessEx.Stream(command_line, stream)
55
+
56
+
57
+ # ----------------------------------------------------------------------
58
+ @app.command("Bundle", no_args_is_help=False)
59
+ def Bundle(
60
+ custom_filename_suffix: Annotated[
61
+ Optional[str],
62
+ typer.Option("--custom-filename-suffix", help="Custom suffix for the output filename."),
63
+ ] = None,
64
+ verbose: Annotated[
65
+ bool,
66
+ typer.Option("--verbose", help="Write verbose information to the terminal."),
67
+ ] = False,
68
+ debug: Annotated[
69
+ bool,
70
+ typer.Option("--debug", help="Write debug information to the terminal."),
71
+ ] = False,
72
+ ) -> None:
73
+ """Bundle a previously built standalone binary."""
74
+
75
+ custom_filename_suffix = (custom_filename_suffix or "").removesuffix("-latest")
76
+
77
+ with DoneManager.CreateCommandLine(
78
+ flags=DoneManagerFlags.Create(verbose=verbose, debug=debug),
79
+ ) as dm:
80
+ build_dir = Path(__file__).parent / "build"
81
+
82
+ if not build_dir.is_dir():
83
+ dm.WriteError(
84
+ f"The build directory '{build_dir}' does not exist. Please run the 'Build' command first.\n"
85
+ )
86
+ return
87
+
88
+ subdirs = list(build_dir.iterdir())
89
+ if len(subdirs) != 1 or not subdirs[0].is_dir():
90
+ dm.WriteError(
91
+ f"The build directory '{build_dir}' should contain exactly one subdirectory with the built binary and its dependencies.\n"
92
+ )
93
+ return
94
+
95
+ build_dir /= subdirs[0]
96
+
97
+ output_name = f"FileBackup{custom_filename_suffix or ''}"
98
+
99
+ if os.name == "nt":
100
+ output_filename = Path(f"{output_name}.zip")
101
+ format = "zip"
102
+ else:
103
+ output_filename = Path(f"{output_name}.tar.gz")
104
+ format = "gztar"
105
+
106
+ with dm.Nested(f"Creating '{output_filename.name}'..."):
107
+ output_filename.unlink(missing_ok=True)
108
+
109
+ shutil.make_archive(
110
+ output_name,
111
+ format,
112
+ root_dir=build_dir,
113
+ )
114
+
115
+
116
+ # ----------------------------------------------------------------------
117
+ # ----------------------------------------------------------------------
118
+ # ----------------------------------------------------------------------
119
+ if __name__ == "__main__":
120
+ app()
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: FileBackup
3
- Version: 0.4.1
3
+ Version: 0.4.3
4
4
  Summary: Tool for creating and restoring file system backups.
5
5
  Project-URL: Homepage, https://github.com/davidbrownell/FileBackup
6
6
  Project-URL: Documentation, https://github.com/davidbrownell/FileBackup
7
7
  Project-URL: Repository, https://github.com/davidbrownell/FileBackup
8
8
  Author-email: David Brownell <github@DavidBrownell.com>
9
- License: MIT
9
+ License-Expression: MIT
10
10
  License-File: LICENSE
11
11
  Keywords: backup,mirror,offsite,restore
12
12
  Classifier: Development Status :: 4 - Beta
@@ -14,7 +14,6 @@ Classifier: Environment :: Console
14
14
  Classifier: Intended Audience :: Developers
15
15
  Classifier: Intended Audience :: End Users/Desktop
16
16
  Classifier: Intended Audience :: System Administrators
17
- Classifier: License :: OSI Approved :: MIT License
18
17
  Classifier: Natural Language :: English
19
18
  Classifier: Operating System :: MacOS
20
19
  Classifier: Operating System :: Microsoft :: Windows
@@ -20,13 +20,14 @@ keywords = [
20
20
  "restore",
21
21
  ]
22
22
 
23
+ license = "MIT"
24
+
23
25
  classifiers = [
24
26
  "Development Status :: 4 - Beta", # TODO
25
27
  "Environment :: Console",
26
28
  "Intended Audience :: Developers",
27
29
  "Intended Audience :: End Users/Desktop",
28
30
  "Intended Audience :: System Administrators",
29
- "License :: OSI Approved :: MIT License",
30
31
  "Natural Language :: English",
31
32
  "Operating System :: MacOS",
32
33
  "Operating System :: Microsoft :: Windows",
@@ -42,9 +43,6 @@ classifiers = [
42
43
  "Topic :: Utilities",
43
44
  ]
44
45
 
45
- [project.license]
46
- text = "MIT"
47
-
48
46
  [project.urls]
49
47
  Homepage = "https://github.com/davidbrownell/FileBackup"
50
48
  Documentation = "https://github.com/davidbrownell/FileBackup"
@@ -61,6 +59,8 @@ build-backend = "hatchling.build"
61
59
  [dependency-groups]
62
60
  dev = [
63
61
  "autogitsemver>=0.8.0",
62
+ "cx-freeze>=8.3.0",
63
+ "dbrownell-commitemojis>=0.1.3",
64
64
  "pre-commit>=4.2.0",
65
65
  "pytest>=8.3.5",
66
66
  "pytest-cov>=6.1.1",
@@ -864,9 +864,9 @@ def Restore(
864
864
  directory_working_dir
865
865
  )
866
866
 
867
- dest_filename.parent.mkdir(parents=True, exist_ok=True)
868
-
869
- os.symlink(fullpath, dest_filename)
867
+ if not dest_filename.is_file():
868
+ dest_filename.parent.mkdir(parents=True, exist_ok=True)
869
+ os.symlink(fullpath, dest_filename)
870
870
 
871
871
  # Read the instructions
872
872
  with (directory_working_dir / INDEX_FILENAME).open() as f:
@@ -9,4 +9,4 @@
9
9
  # Note that this value will be overwritten by calls to `python ../../Build.py update_version` based
10
10
  # on changes observed in the git repository. The default value below will be used until the value
11
11
  # here is explicitly updated by the Continuous Integration system as part of a commit.
12
- __version__ = "0.4.1"
12
+ __version__ = "0.4.3"
@@ -1111,6 +1111,49 @@ class TestRestore(object):
1111
1111
  sep=os.path.sep,
1112
1112
  )
1113
1113
 
1114
+ # ----------------------------------------------------------------------
1115
+ @pytest.mark.parametrize("is_local_filesystem", [True, False])
1116
+ @pytest.mark.parametrize("encryption_password", [None, str(uuid.uuid4())])
1117
+ @pytest.mark.parametrize("compress", [False, True])
1118
+ def test_RestoreMultipleBackupsSameFile(
1119
+ self, _working_dir, tmp_path_factory, compress, encryption_password, is_local_filesystem
1120
+ ):
1121
+ with _YieldInitializedBackupHelper(
1122
+ tmp_path_factory, _working_dir, compress, encryption_password
1123
+ ) as backup_helper:
1124
+ restore_helper = _RestoreHelper.Create(
1125
+ _working_dir,
1126
+ tmp_path_factory,
1127
+ encryption_password,
1128
+ is_local_filesystem,
1129
+ backup_helper.backup_name,
1130
+ backup_helper.output_dir,
1131
+ )
1132
+
1133
+ # Read the contents of a file. We will remove this file, create a backup, and then
1134
+ # restore the same file.
1135
+ file_under_test = _working_dir / "one" / "A"
1136
+ assert file_under_test.is_file(), file_under_test
1137
+
1138
+ file_under_test_contents = file_under_test.read_text(encoding="utf-8")
1139
+
1140
+ backup_file_under_test = restore_helper.backup_dir / "one" / "A"
1141
+
1142
+ # Remove the file
1143
+ file_under_test.unlink()
1144
+
1145
+ backup_helper.ExecuteBackup(_working_dir, compress, encryption_password)
1146
+
1147
+ # Write the file
1148
+ file_under_test.write_text(file_under_test_contents, encoding="utf-8")
1149
+
1150
+ backup_helper.ExecuteBackup(_working_dir, compress, encryption_password)
1151
+
1152
+ # Restore the backup
1153
+ restore_helper.ExecuteRestore(10)
1154
+
1155
+ assert Path(restore_helper.output_dir / "one" / "A").is_file()
1156
+
1114
1157
 
1115
1158
  # ----------------------------------------------------------------------
1116
1159
  class TestRestoreErrors:
@@ -1487,7 +1530,7 @@ class _RestoreHelper(object):
1487
1530
 
1488
1531
  output = cast(str, next(dm_and_content))
1489
1532
 
1490
- assert dm.result == expected_result
1533
+ assert dm.result == expected_result, output
1491
1534
 
1492
1535
  if expected_num_files is not None:
1493
1536
  TestHelpers.CompareFileSystemSourceAndDestination(
@@ -1,6 +1,15 @@
1
1
  version = 1
2
2
  revision = 2
3
3
  requires-python = ">=3.10"
4
+ resolution-markers = [
5
+ "(platform_machine != 'aarch64' and platform_machine != 'armv7l' and platform_machine != 'i686' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64') or sys_platform != 'linux'",
6
+ "platform_machine == 'x86_64' and sys_platform == 'linux'",
7
+ "platform_machine == 'i686' and sys_platform == 'linux'",
8
+ "platform_machine == 'aarch64' and sys_platform == 'linux'",
9
+ "platform_machine == 'armv7l' and sys_platform == 'linux'",
10
+ "platform_machine == 'ppc64le' and sys_platform == 'linux'",
11
+ "platform_machine == 's390x' and sys_platform == 'linux'",
12
+ ]
4
13
 
5
14
  [[package]]
6
15
  name = "attrs"
@@ -84,6 +93,15 @@ wheels = [
84
93
  { url = "https://files.pythonhosted.org/packages/63/13/47bba97924ebe86a62ef83dc75b7c8a881d53c535f83e2c54c4bd701e05c/bcrypt-4.3.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:57967b7a28d855313a963aaea51bf6df89f833db4320da458e5b3c5ab6d4c938", size = 280110, upload-time = "2025-02-28T01:24:05.896Z" },
85
94
  ]
86
95
 
96
+ [[package]]
97
+ name = "cabarchive"
98
+ version = "0.2.4"
99
+ source = { registry = "https://pypi.org/simple" }
100
+ sdist = { url = "https://files.pythonhosted.org/packages/28/d3/a544aed878edc269ce4427bc937310b73624e1d595de7f4e5bcab413a639/cabarchive-0.2.4.tar.gz", hash = "sha256:04f60089473114cf26eab2b7e1d09611c5bfaf8edd3202dacef66bb5c71e48cf", size = 21064, upload-time = "2022-02-23T09:28:10.911Z" }
101
+ wheels = [
102
+ { url = "https://files.pythonhosted.org/packages/0f/fb/713421f46c68f4bf9cd26f05bda0c233446108997b6b4d83d7ef07f20009/cabarchive-0.2.4-py3-none-any.whl", hash = "sha256:4afabd224eb2e40af8e907379fb8eec6b0adfb71c2aef4457ec3a4d77383c059", size = 25729, upload-time = "2022-02-23T09:28:09.571Z" },
103
+ ]
104
+
87
105
  [[package]]
88
106
  name = "cffi"
89
107
  version = "1.17.1"
@@ -283,6 +301,90 @@ wheels = [
283
301
  { url = "https://files.pythonhosted.org/packages/87/62/d69eb4a8ee231f4bf733a92caf9da13f1c81a44e874b1d4080c25ecbb723/cryptography-44.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:5d20cc348cca3a8aa7312f42ab953a56e15323800ca3ab0706b8cd452a3a056c", size = 3134369, upload-time = "2025-05-02T19:35:58.907Z" },
284
302
  ]
285
303
 
304
+ [[package]]
305
+ name = "cx-freeze"
306
+ version = "8.3.0"
307
+ source = { registry = "https://pypi.org/simple" }
308
+ dependencies = [
309
+ { name = "cabarchive", marker = "sys_platform == 'win32'" },
310
+ { name = "cx-logging", marker = "platform_machine != 'ARM64' and sys_platform == 'win32'" },
311
+ { name = "dmgbuild", marker = "sys_platform == 'darwin'" },
312
+ { name = "filelock" },
313
+ { name = "lief", marker = "platform_machine != 'ARM64' and sys_platform == 'win32'" },
314
+ { name = "packaging" },
315
+ { name = "patchelf", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'armv7l' and sys_platform == 'linux') or (platform_machine == 'i686' and sys_platform == 'linux') or (platform_machine == 'ppc64le' and sys_platform == 'linux') or (platform_machine == 's390x' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" },
316
+ { name = "setuptools" },
317
+ { name = "striprtf", marker = "sys_platform == 'win32'" },
318
+ { name = "tomli", marker = "python_full_version < '3.11'" },
319
+ ]
320
+ sdist = { url = "https://files.pythonhosted.org/packages/92/fa/835edcb0bbfffc09bea4a723c26779e3691513c6bfd41dc92498289218be/cx_freeze-8.3.0.tar.gz", hash = "sha256:491998d513f04841ec7967e2a3792db198597bde8a0c9333706b1f96060bdb35", size = 3180070, upload-time = "2025-05-12T00:18:41.067Z" }
321
+ wheels = [
322
+ { url = "https://files.pythonhosted.org/packages/1a/62/c70bcc537051e03a71f99450f51bfe7bcfd240829639d7c05a53221acd42/cx_freeze-8.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b9f967d10ebd8993e03c26b7fe25a1b9e34b523540f92a504583abe81a891ee7", size = 19140451, upload-time = "2025-05-12T00:17:06.623Z" },
323
+ { url = "https://files.pythonhosted.org/packages/e2/07/aae1ecd6da92eba3c8d5bb71dc3e7a2aa51232c228afe3e32e43c87ff530/cx_freeze-8.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dfed39871d1623436d726bf239ac361c0f744c073b60bdcad9278465bae70f8", size = 13232549, upload-time = "2025-05-12T00:17:10.276Z" },
324
+ { url = "https://files.pythonhosted.org/packages/36/20/00621712b7b5087f5e32d8ce63ba7ce4013ea971d51e1d0e70cce5b340c0/cx_freeze-8.3.0-cp310-cp310-win32.whl", hash = "sha256:848611568876236fbedb21c9307afad24df239f3ecd378f6f161fe5a80192db0", size = 2225763, upload-time = "2025-05-12T00:17:13.068Z" },
325
+ { url = "https://files.pythonhosted.org/packages/cb/88/364c89d2a439c33c204112931088dc8da7161d2013103b77170fca699b5b/cx_freeze-8.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e1ee15d2abfb238c1f19a764608dfc8ee7f755f77a5d53de996cd1579e420d1", size = 2230495, upload-time = "2025-05-12T00:17:16.873Z" },
326
+ { url = "https://files.pythonhosted.org/packages/04/f6/ae15b89dd00a6dddebdcc25599915ee94d612d9fe502df0b46ba213d30fe/cx_freeze-8.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:197746f5df28bf136554cecf1d45504784734343f05ac34889ffef2265ed895f", size = 21647628, upload-time = "2025-05-12T00:17:18.81Z" },
327
+ { url = "https://files.pythonhosted.org/packages/77/ba/004331711db1913bc27a844d6cb89b48b0dabea0fadc0adf57dd2e090b80/cx_freeze-8.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:942cec33e2f5c31b97b43a2040fdd8e3f43e783233fb6f695989242078417f47", size = 13795087, upload-time = "2025-05-12T00:17:21.336Z" },
328
+ { url = "https://files.pythonhosted.org/packages/6c/5f/9d66343f42c5fdfaa0e4afb3def357b54159a034f0990adbf27ba5c08620/cx_freeze-8.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af62ea35cf5b1d13c6c42dca240388d6ed880e503e2e28c3346a8666be04655c", size = 15270022, upload-time = "2025-05-12T00:17:24.34Z" },
329
+ { url = "https://files.pythonhosted.org/packages/94/d1/c073a99d2633a1c231921d5a9ba9f1f94485da7a75d0139101f4e157c1c5/cx_freeze-8.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:349fd483db63f3552305d62d10e645dd0e68a023c8c96d1105e7bbad9bf881d1", size = 13920961, upload-time = "2025-05-12T00:17:27.081Z" },
330
+ { url = "https://files.pythonhosted.org/packages/57/2d/ef8ca36b173444a47ffc94086f3fb03c0ca2f4465f7db14a8c82d06e3ed7/cx_freeze-8.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:497696c4b476bc948e7cb17b28d19712bf3920ad54751f734bb887c54d567c86", size = 14959332, upload-time = "2025-05-12T00:17:29.938Z" },
331
+ { url = "https://files.pythonhosted.org/packages/bb/a9/96281c51edde509e73fe16cd3cd997cb4982ec907818a4b9a25289838baf/cx_freeze-8.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a3792b7bfced6cf5636ee82918c007da1b3465884b5a26a0044f05f83cd68964", size = 14697811, upload-time = "2025-05-12T00:17:32.816Z" },
332
+ { url = "https://files.pythonhosted.org/packages/28/a3/d6d7bcec621e133a2d7fd6fbc2581fd6294ffa0b9adf5f9ac2454779d79b/cx_freeze-8.3.0-cp311-cp311-win32.whl", hash = "sha256:f6f9cafef1338b6eb7d377d380e5f5ccadbb1e7112712c861e53db4d68988943", size = 2357100, upload-time = "2025-05-12T00:17:35.024Z" },
333
+ { url = "https://files.pythonhosted.org/packages/7b/71/6e3f0412887395bf5d8e4ceffbeef8995a3c4b7b207fe40850df63e02dc6/cx_freeze-8.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6aacb4801bed46700261cb4b75abfa45e95504756e6c5b95545350b3e6c77f39", size = 2361817, upload-time = "2025-05-12T00:17:37.063Z" },
334
+ { url = "https://files.pythonhosted.org/packages/bd/34/997343c959b0bba8df70e7ac55171f962f4e4e4bf957c82e2470b3125e2c/cx_freeze-8.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:a02c33c1e973d0f3eff83aec30312ee0e211b3990f3f62b27d9ee971a122982c", size = 2349532, upload-time = "2025-05-12T00:17:38.638Z" },
335
+ { url = "https://files.pythonhosted.org/packages/b1/d6/4c66e670768cdc8219bbd5e3efd96a25506f16e83b599004ffae0828e6b0/cx_freeze-8.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3d6f158ad36170caad12a4aae5b65ed4fdf8d772c60c2dad8bf9341a1fc8b4c6", size = 21986587, upload-time = "2025-05-12T00:17:41.085Z" },
336
+ { url = "https://files.pythonhosted.org/packages/de/97/ddd0daa6de5da6d142a77095d66c8466442f0f8721c6eaa52b63bdbbb29a/cx_freeze-8.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abdba6a199dbd3a2ac661ec25160aceffcb94f3508757dd13639dca1fc82572", size = 14439323, upload-time = "2025-05-12T00:17:43.607Z" },
337
+ { url = "https://files.pythonhosted.org/packages/b5/0b/b4cf3e7dffd1a4fa6aa80b26af6b21d0b6dafff56495003639eebdc9a9ba/cx_freeze-8.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdd7da34aeb55332d7ed9a5dd75a6a5b8a007a28458d79d0acad2611c5162e55", size = 15943470, upload-time = "2025-05-12T00:17:46.032Z" },
338
+ { url = "https://files.pythonhosted.org/packages/e8/b5/21dfa6fd4580bed578e22f4be2f42d585d1e064f1b58fc2321477030414e/cx_freeze-8.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95d0460511a295f65f25e537cd1e716013868f5cab944a20fc77f5e9c3425ec6", size = 14576320, upload-time = "2025-05-12T00:17:49.082Z" },
339
+ { url = "https://files.pythonhosted.org/packages/9b/08/76270e82bff702edd584e252239c1ab92e1807cf5ca2efafd0c69a948775/cx_freeze-8.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c661650119ceb4c2c779134d4a34823b63c8bea5c5686c33a013cd374f3763c3", size = 15600098, upload-time = "2025-05-12T00:17:51.974Z" },
340
+ { url = "https://files.pythonhosted.org/packages/98/8c/4da11732f32ed51f2b734caa3fe87559734f68f508ce54b56196ae1c4410/cx_freeze-8.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:56e52892393562a00792635bb8ab6d5720290b7b86ae21b6eb002a610fac5713", size = 15382203, upload-time = "2025-05-12T00:17:54.445Z" },
341
+ { url = "https://files.pythonhosted.org/packages/f6/1a/64c825770df0b9cb69e5f15c2647e708bf8e13f55da1011749658bc83c37/cx_freeze-8.3.0-cp312-cp312-win32.whl", hash = "sha256:3bad93b5e44c9faee254b0b27a1698c053b569122e73a32858b8e80e340aa8f2", size = 2336981, upload-time = "2025-05-12T00:17:57.116Z" },
342
+ { url = "https://files.pythonhosted.org/packages/bf/68/09458532149bcb26bbc078ed232c2f970476d6381045ce76de32ef6014c2/cx_freeze-8.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:82887045c831e5c03f4a33f8baab826b785c6400493a077c482cc45c15fd531c", size = 2341781, upload-time = "2025-05-12T00:17:59.198Z" },
343
+ { url = "https://files.pythonhosted.org/packages/82/fe/ebe723ade801df8f1030d90b9b676efd43bbf12ca833bb4b82108101ed8e/cx_freeze-8.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:72b9d7e3e98bbc175096b66e67208aea5b2e283f07e3d826c40f89f60a821ae1", size = 2329301, upload-time = "2025-05-12T00:18:00.734Z" },
344
+ { url = "https://files.pythonhosted.org/packages/f5/ba/a98447964bde34e93774ff500c2efcd0dce150754e835c32bbf11754ee92/cx_freeze-8.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5ab5f97a3719282b9105b4d5eacd9b669f79d8e0129e20a55137746663d288ad", size = 21407613, upload-time = "2025-05-12T00:18:02.684Z" },
345
+ { url = "https://files.pythonhosted.org/packages/45/df/ba05eba858fa33bfcdde589d4b22333ff1444f42ff66e88ad98133105126/cx_freeze-8.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a27d8af666b7ef4a8fa612591b5555c57d564f4f17861bdd11e0bd050a33b592", size = 12443001, upload-time = "2025-05-12T00:18:05.108Z" },
346
+ { url = "https://files.pythonhosted.org/packages/da/da/a97fbb2ee9fb958aca527a9a018a98e8127f0b43c4fb09323d2cdbc4ec94/cx_freeze-8.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35ee2d0de99dea99156507a63722a5eefacbc492d2bf582978a6dbb3fecc972b", size = 12559468, upload-time = "2025-05-12T00:18:08.016Z" },
347
+ { url = "https://files.pythonhosted.org/packages/36/22/5e1c967e4c8bd129f0fe5d94b0f653bf7709fde251c2dc77f6c5da097163/cx_freeze-8.3.0-cp313-cp313-win32.whl", hash = "sha256:c19b092980e3430a963d328432763742baf852d3ff5fef096b2f32e130cfc0ed", size = 2333521, upload-time = "2025-05-12T00:18:10.584Z" },
348
+ { url = "https://files.pythonhosted.org/packages/b2/61/18c51dfb8bfcd36619c9314d36168c5254d0ce6d40f70fe1ace55edd1991/cx_freeze-8.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:007fb9507b5265c0922aaea10173651a2138b3d75ee9a67156fea4c9fb2b2582", size = 2337819, upload-time = "2025-05-12T00:18:12.154Z" },
349
+ { url = "https://files.pythonhosted.org/packages/2d/4b/53a5c7d44e482edadba39f7c62e8cafbc22a699f79230aa7bcb23257c12c/cx_freeze-8.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:bab3634e91c09f235a40b998a9b23327625c9032014c2a9365aa3e8c5f6b5a05", size = 2326957, upload-time = "2025-05-12T00:18:13.92Z" },
350
+ { url = "https://files.pythonhosted.org/packages/5a/dd/dce38e545203c7ef14bf9c9c2beb1d05093f7b1d7c95ca03ff716c920413/cx_freeze-8.3.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:061c81fcff963d0735ff3a85abb9ca9d29d3663ce8eeef6b663bd93ecafb93bb", size = 21209751, upload-time = "2025-05-12T00:18:15.822Z" },
351
+ { url = "https://files.pythonhosted.org/packages/c8/fc/82153be6a3e7e6ad9d2baa1453f5e6c6e744f711f12284d50daa95c63e30/cx_freeze-8.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0db71e7c540b0b95396e4c1c18af2748d96c2c2e44142a0e65bb8925f736cc6", size = 12657585, upload-time = "2025-05-12T00:18:19.703Z" },
352
+ { url = "https://files.pythonhosted.org/packages/82/a3/9d72b12ab11a89ef84e3c03d5290b3b58dd5c3427e6d6f5597c776e01ab8/cx_freeze-8.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca2eb036fffd7fc07e793989db4424557d9b00c7b82e33f575dbc40d72f52f7b", size = 13887006, upload-time = "2025-05-12T00:18:22.209Z" },
353
+ { url = "https://files.pythonhosted.org/packages/10/ab/08a5aa1744a708de8ff4bc9c6edd6addc5effdb6c31a85ff425284e4563f/cx_freeze-8.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a58582c34ccfc94e9e19acc784511396e95c324bb54c5454b7eafec5a205c677", size = 12738066, upload-time = "2025-05-12T00:18:25.027Z" },
354
+ { url = "https://files.pythonhosted.org/packages/ef/59/86beaf28c76921f338a2799295ab50766737064920d5182d238eff8578c7/cx_freeze-8.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c41676ebf3e5ca7dd086dedf3a9d5b5627f3c98ffccf64db0aeebd5102199b05", size = 13642689, upload-time = "2025-05-12T00:18:27.561Z" },
355
+ { url = "https://files.pythonhosted.org/packages/51/bb/0b6992fb528dca772f83ab5534ce00e43f978d7ac393bab5d3e2553fb7a9/cx_freeze-8.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ae0cfb83bc82671c4701a36954c5e8c5cf9440777365b78e9ceba51522becd40", size = 13322215, upload-time = "2025-05-12T00:18:30.425Z" },
356
+ ]
357
+
358
+ [[package]]
359
+ name = "cx-logging"
360
+ version = "3.2.1"
361
+ source = { registry = "https://pypi.org/simple" }
362
+ sdist = { url = "https://files.pythonhosted.org/packages/9d/69/50b0c38e26658072b0221f1ea243c47dd56a9f3f50e5754aa5a39189145c/cx_logging-3.2.1.tar.gz", hash = "sha256:812665ae5012680a6fe47095c3772bce638e47cf05b2c3483db3bdbe6b06da44", size = 26966, upload-time = "2024-10-13T03:13:10.561Z" }
363
+ wheels = [
364
+ { url = "https://files.pythonhosted.org/packages/65/94/1cf7a9265a11d9a272be881d4a16d2ce974558f1a4b5339d0b81e3935039/cx_Logging-3.2.1-cp310-cp310-win32.whl", hash = "sha256:4fb0d7c6dc9a8c403e4c62a3be87301946102d036fbe7bd66c6851225ac05a2e", size = 22792, upload-time = "2024-10-13T03:13:18.418Z" },
365
+ { url = "https://files.pythonhosted.org/packages/59/df/93bdca669af28c4fe0ada18ef5313dece70b5611ee46d90bd2fd156401e3/cx_Logging-3.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:42f48fae8254b6de27710b6bfd34467fde88072d5961f67e88914d7e2bb6c13e", size = 26748, upload-time = "2024-10-13T03:13:19.936Z" },
366
+ { url = "https://files.pythonhosted.org/packages/97/5f/0307bd16b05c332611e020d0864c1f7e820a671399a125b08b3762069b3a/cx_Logging-3.2.1-cp311-cp311-win32.whl", hash = "sha256:ef526f0ddeba8611942ee76f2117cebb6319a2413b4077c2c1bf0947a61b9148", size = 22715, upload-time = "2024-10-13T03:13:23.291Z" },
367
+ { url = "https://files.pythonhosted.org/packages/64/7b/e2208fa901b3375ed0dada2d03fd8ff78399f3e14dd4b6933d896becb2fd/cx_Logging-3.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:4f6366871aa70439c4e3c25c3bb3dd70e8ee98bc190fd30862d7b199948b26f8", size = 26887, upload-time = "2024-10-13T03:13:24.548Z" },
368
+ { url = "https://files.pythonhosted.org/packages/b1/9b/d8babcfafa7233b862b310a6fe630fc5e6ced02453ca4e60b0c819afbaff/cx_Logging-3.2.1-cp312-cp312-win32.whl", hash = "sha256:3f3de06cf09d5986b39e930c213567c340b3237dfce03d8d3bf6099475eaa02e", size = 22869, upload-time = "2024-10-13T03:13:28.258Z" },
369
+ { url = "https://files.pythonhosted.org/packages/5c/52/b6bd4f4d51eb4f3523da182cdf5969a560e35f4ef178f34841ba6795addc/cx_Logging-3.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:3452add0544db6ff29116b72a4c48761aaffa9b638728330433853c0c4ad2ea1", size = 26911, upload-time = "2024-10-13T03:13:29.521Z" },
370
+ { url = "https://files.pythonhosted.org/packages/e1/78/0ce28b89aedf369b02bb5cb763324e799844144386fba75c03128ea9e2ff/cx_Logging-3.2.1-cp313-cp313-win32.whl", hash = "sha256:330a29030bdca8795c99b678b4f6d87a75fb606eed1da206fdd9fa579a33dc21", size = 22874, upload-time = "2024-10-13T03:13:32.99Z" },
371
+ { url = "https://files.pythonhosted.org/packages/cb/23/dab5f561888951ec02843f087f34a59c791e8ac6423c25a412eb49300633/cx_Logging-3.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:e14748b031522a95aa2db4adfc5f2be5f96f4d0fe687da591114f73a09e66926", size = 26916, upload-time = "2024-10-13T03:13:34.085Z" },
372
+ ]
373
+
374
+ [[package]]
375
+ name = "dbrownell-commitemojis"
376
+ version = "0.1.3"
377
+ source = { registry = "https://pypi.org/simple" }
378
+ dependencies = [
379
+ { name = "dbrownell-common" },
380
+ { name = "rich" },
381
+ { name = "typer" },
382
+ ]
383
+ sdist = { url = "https://files.pythonhosted.org/packages/4e/95/85ff558602bf696cfe9689a84ba16459b097c3c20814dcd1962f4d89b08c/dbrownell_commitemojis-0.1.3.tar.gz", hash = "sha256:63a789a89f24f55d387b1c52f605f0b8d07caebf5d64479b94bbd7a7faf48139", size = 220282, upload-time = "2025-05-14T18:15:48.832Z" }
384
+ wheels = [
385
+ { url = "https://files.pythonhosted.org/packages/7e/45/ec235180106fe487846728852dcf2e50644f3d6944ed07ffb1f8b83b5b7b/dbrownell_commitemojis-0.1.3-py3-none-any.whl", hash = "sha256:44ec15af79ff3d5ac9279e17dba0e9e7c06a0aa762ad698581a364d14dce7235", size = 13101, upload-time = "2025-05-14T18:15:47.485Z" },
386
+ ]
387
+
286
388
  [[package]]
287
389
  name = "dbrownell-common"
288
390
  version = "0.14.6"
@@ -306,6 +408,31 @@ wheels = [
306
408
  { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload-time = "2024-10-09T18:35:44.272Z" },
307
409
  ]
308
410
 
411
+ [[package]]
412
+ name = "dmgbuild"
413
+ version = "1.6.5"
414
+ source = { registry = "https://pypi.org/simple" }
415
+ dependencies = [
416
+ { name = "ds-store", marker = "(platform_machine != 'aarch64' and platform_machine != 'armv7l' and platform_machine != 'i686' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64') or sys_platform != 'linux'" },
417
+ { name = "mac-alias", marker = "(platform_machine != 'aarch64' and platform_machine != 'armv7l' and platform_machine != 'i686' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64') or sys_platform != 'linux'" },
418
+ ]
419
+ sdist = { url = "https://files.pythonhosted.org/packages/16/93/b9702c68d5dedfd6b91c76268a89091ff681b8e3b9a026e7919b6ab730a4/dmgbuild-1.6.5.tar.gz", hash = "sha256:c5cbeec574bad84a324348aa7c36d4aada04568c99fb104dec18d22ba3259f45", size = 36848, upload-time = "2025-03-21T01:04:10.093Z" }
420
+ wheels = [
421
+ { url = "https://files.pythonhosted.org/packages/48/4a/b16f1081f69592c6dba92baa4d3ca7a5685091a0f840f4b5e01be41aaf84/dmgbuild-1.6.5-py3-none-any.whl", hash = "sha256:e19ab8c5e8238e6455d9ccb9175817be7fd62b9cdd1eef20f63dd88e0ec469ab", size = 34906, upload-time = "2025-03-21T01:04:08.044Z" },
422
+ ]
423
+
424
+ [[package]]
425
+ name = "ds-store"
426
+ version = "1.3.1"
427
+ source = { registry = "https://pypi.org/simple" }
428
+ dependencies = [
429
+ { name = "mac-alias", marker = "(platform_machine != 'aarch64' and platform_machine != 'armv7l' and platform_machine != 'i686' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64') or sys_platform != 'linux'" },
430
+ ]
431
+ sdist = { url = "https://files.pythonhosted.org/packages/7c/36/902259bf7ddb142dd91cf7a9794aa15e1a8ab985974f90375e5d3463b441/ds_store-1.3.1.tar.gz", hash = "sha256:c27d413caf13c19acb85d75da4752673f1f38267f9eb6ba81b3b5aa99c2d207c", size = 27052, upload-time = "2022-11-24T06:13:34.376Z" }
432
+ wheels = [
433
+ { url = "https://files.pythonhosted.org/packages/47/bf/b1c10362a0d670ee8ae086d92c3ab795fca2a927e4ff25e7cd15224d3863/ds_store-1.3.1-py3-none-any.whl", hash = "sha256:fbacbb0bd5193ab3e66e5a47fff63619f15e374ffbec8ae29744251a6c8f05b5", size = 16268, upload-time = "2022-11-24T06:13:30.797Z" },
434
+ ]
435
+
309
436
  [[package]]
310
437
  name = "exceptiongroup"
311
438
  version = "1.2.2"
@@ -327,6 +454,8 @@ dependencies = [
327
454
  [package.dev-dependencies]
328
455
  dev = [
329
456
  { name = "autogitsemver" },
457
+ { name = "cx-freeze" },
458
+ { name = "dbrownell-commitemojis" },
330
459
  { name = "pre-commit" },
331
460
  { name = "pytest" },
332
461
  { name = "pytest-cov" },
@@ -343,6 +472,8 @@ requires-dist = [
343
472
  [package.metadata.requires-dev]
344
473
  dev = [
345
474
  { name = "autogitsemver", specifier = ">=0.8.0" },
475
+ { name = "cx-freeze", specifier = ">=8.3.0" },
476
+ { name = "dbrownell-commitemojis", specifier = ">=0.1.3" },
346
477
  { name = "pre-commit", specifier = ">=4.2.0" },
347
478
  { name = "pytest", specifier = ">=8.3.5" },
348
479
  { name = "pytest-cov", specifier = ">=6.1.1" },
@@ -436,6 +567,33 @@ wheels = [
436
567
  { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload-time = "2025-04-23T12:34:05.422Z" },
437
568
  ]
438
569
 
570
+ [[package]]
571
+ name = "lief"
572
+ version = "0.16.5"
573
+ source = { registry = "https://pypi.org/simple" }
574
+ wheels = [
575
+ { url = "https://files.pythonhosted.org/packages/3e/9f/d396d28ad1d0e32926849e2a4fdf2946f65c3d30059d0248f5c2f85e9720/lief-0.16.5-cp310-cp310-win32.whl", hash = "sha256:28e2f91f0e10658898e1875a446c70563eba18f2f0ebb311e0c65192f59d5e6a", size = 3042782, upload-time = "2025-04-19T16:51:08.341Z" },
576
+ { url = "https://files.pythonhosted.org/packages/74/47/78731ce36ceeafa69d3a26ccf5d5771cc9929ee666e7b7aab6eaa6852c7b/lief-0.16.5-cp310-cp310-win_amd64.whl", hash = "sha256:8060485581c1cb5dc4a74001be0cbad68c6ec03e2951d1980fe03f93c749ea65", size = 3168233, upload-time = "2025-04-19T16:51:11.165Z" },
577
+ { url = "https://files.pythonhosted.org/packages/ff/6e/fa423661155afe709f49ae3ccd8b6d55d83a7ac2b9a4a38f69280e9c1f46/lief-0.16.5-cp311-cp311-win32.whl", hash = "sha256:d23d2ca7f6ec1d65a68cd3fcda4e3620b9b72e7afdea535ff28f4d52e0b86173", size = 3043058, upload-time = "2025-04-19T16:51:30.285Z" },
578
+ { url = "https://files.pythonhosted.org/packages/64/b4/bc6048149c305c38001f2a9891d84d8f84f5c970c7495eabe4459a9a738c/lief-0.16.5-cp311-cp311-win_amd64.whl", hash = "sha256:3325194fa0bc4ca9b643423fd9177e613b461cccedecc194e55686334b1f8de2", size = 3168670, upload-time = "2025-04-19T16:51:32.886Z" },
579
+ { url = "https://files.pythonhosted.org/packages/17/f8/4cd814800254fc2e4e63c30f46535d8fab0361a9e63e3d73acff835deeba/lief-0.16.5-cp311-cp311-win_arm64.whl", hash = "sha256:8bfab65187693fe44a9438e03a2ba13d7a4c724f22c9b345099cd8abd4c76514", size = 3064539, upload-time = "2025-04-19T16:51:35.46Z" },
580
+ { url = "https://files.pythonhosted.org/packages/20/68/c7df68afe1c37be667f1adb74544b06316fd1338dd577fd0c1289817d2d1/lief-0.16.5-cp312-cp312-win32.whl", hash = "sha256:768f91db886432c4b257fb88365a2c6842f26190b73964cf9274c276bc17b490", size = 3049882, upload-time = "2025-04-19T16:51:53.584Z" },
581
+ { url = "https://files.pythonhosted.org/packages/08/8b/0fdc6b420e24df7c8cc02be595c425e821f2d4eb1be98eb16a7cf4e87fd0/lief-0.16.5-cp312-cp312-win_amd64.whl", hash = "sha256:587225fd6e1ec424a1a776928beb67095894254c51148b78903844d62faa1a2d", size = 3178830, upload-time = "2025-04-19T16:51:55.254Z" },
582
+ { url = "https://files.pythonhosted.org/packages/e5/a6/f751d12b88527b591f26a7c4a2b896806c065d9bdfb49eaabec9e6aead41/lief-0.16.5-cp312-cp312-win_arm64.whl", hash = "sha256:ef043c1796d221f128597dc32819fa6bb31da26d2a9b911a32d4a5cdfb566f85", size = 3066592, upload-time = "2025-04-19T16:51:57.86Z" },
583
+ { url = "https://files.pythonhosted.org/packages/d8/97/72fe8e8bfbfea9d76350635965f668e855490c6f2779c08bf1b9ab3a505d/lief-0.16.5-cp313-cp313-win32.whl", hash = "sha256:6fc879c1c90bf31f7720ece90bd919cbfeeb3bdbc9327f6a16d4dc1af273aef9", size = 3049849, upload-time = "2025-04-19T16:52:11.327Z" },
584
+ { url = "https://files.pythonhosted.org/packages/66/fc/6faf93a5b44f9e7df193e9fc95b93a7f34b2155b1b470ef61f2f25704a84/lief-0.16.5-cp313-cp313-win_amd64.whl", hash = "sha256:2f208359d10ade57ace7f7625e2f5e4ca214b4b67f9ade24ca07dafb08e37b0c", size = 3178645, upload-time = "2025-04-19T16:52:13.112Z" },
585
+ { url = "https://files.pythonhosted.org/packages/6d/47/d0a47b6856d832a2ab0896faa773b4506b41e39131684892017351e8ff28/lief-0.16.5-cp313-cp313-win_arm64.whl", hash = "sha256:afb7d946aa2b62c95831d3be45f2516324418335b077f5337012b779e8dcc97b", size = 3066502, upload-time = "2025-04-19T16:52:14.787Z" },
586
+ ]
587
+
588
+ [[package]]
589
+ name = "mac-alias"
590
+ version = "2.2.2"
591
+ source = { registry = "https://pypi.org/simple" }
592
+ sdist = { url = "https://files.pythonhosted.org/packages/ea/a3/83b50f620d318a98363dc7e701fb94856eaaecc472e23a89ac625697b3ea/mac_alias-2.2.2.tar.gz", hash = "sha256:c99c728eb512e955c11f1a6203a0ffa8883b26549e8afe68804031aa5da856b7", size = 34073, upload-time = "2022-12-06T00:37:47.779Z" }
593
+ wheels = [
594
+ { url = "https://files.pythonhosted.org/packages/39/a1/4136777ed6a56df83e7c748ad28892f0672cbbcdc3b3d15a57df6ba72443/mac_alias-2.2.2-py3-none-any.whl", hash = "sha256:504ab8ac546f35bbd75ad014d6ad977c426660aa721f2cd3acf3dc2f664141bd", size = 21220, upload-time = "2022-12-06T00:37:46.025Z" },
595
+ ]
596
+
439
597
  [[package]]
440
598
  name = "markdown-it-py"
441
599
  version = "3.0.0"
@@ -489,6 +647,20 @@ wheels = [
489
647
  { url = "https://files.pythonhosted.org/packages/15/f8/c7bd0ef12954a81a1d3cea60a13946bd9a49a0036a5927770c461eade7ae/paramiko-3.5.1-py3-none-any.whl", hash = "sha256:43b9a0501fc2b5e70680388d9346cf252cfb7d00b0667c39e80eb43a408b8f61", size = 227298, upload-time = "2025-02-04T02:37:57.672Z" },
490
648
  ]
491
649
 
650
+ [[package]]
651
+ name = "patchelf"
652
+ version = "0.17.2.2"
653
+ source = { registry = "https://pypi.org/simple" }
654
+ sdist = { url = "https://files.pythonhosted.org/packages/0d/41/dc3ee5838db2d90be935adb53ae7745135d9c719d070b1989b246f983c7f/patchelf-0.17.2.2.tar.gz", hash = "sha256:080b2ac3074fd4ab257700088e82470425e56609aa0dd07abe548f04b7b3b007", size = 149517, upload-time = "2025-03-16T08:30:21.909Z" }
655
+ wheels = [
656
+ { url = "https://files.pythonhosted.org/packages/8d/15/25b5d10d971f509fe6bc8951b855f0f05be4c24e0dd1616c14a6e1a9116a/patchelf-0.17.2.2-py3-none-manylinux1_i686.manylinux_2_5_i686.musllinux_1_1_i686.whl", hash = "sha256:3b8a4d7cccac04d8231dec321245611bf147b199cbf4da305d1a364ff689fb58", size = 524182, upload-time = "2025-03-16T08:30:11.93Z" },
657
+ { url = "https://files.pythonhosted.org/packages/f2/f9/e070956e350ccdfdf059251836f757ad91ac0c01b0ba3e033ea7188d8d42/patchelf-0.17.2.2-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:e334ebb1c5aa9fc740fd95ebe449271899fe1e45a3eb0941300b304f7e3d1299", size = 466519, upload-time = "2025-03-16T08:30:13.383Z" },
658
+ { url = "https://files.pythonhosted.org/packages/56/0d/dc3ac6c6e9e9d0d3e40bee1abe95a07034f83627319e60a7dc9abdbfafee/patchelf-0.17.2.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:3d32cd69442a229724f7f071b61cef1f87ccd80cf755af0b1ecefd553fa9ae3f", size = 462123, upload-time = "2025-03-16T08:30:15.57Z" },
659
+ { url = "https://files.pythonhosted.org/packages/1e/f6/b842b19c2b72df1c524ab3793c3ec9cf3926c7c841e0b64b34f95d7fb806/patchelf-0.17.2.2-py3-none-manylinux2014_armv7l.manylinux_2_17_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:05f6bbdbe484439cb025e20c60abd37e432e6798dfa3f39a072e6b7499072a8c", size = 412347, upload-time = "2025-03-16T08:30:17.332Z" },
660
+ { url = "https://files.pythonhosted.org/packages/a8/0b/33eb3087703d903dd01cf6b0d64e067bf3718a5e8b1239bc6fc2c4b1fdb2/patchelf-0.17.2.2-py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:b54e79ceb444ec6a536a5dc2e8fc9c771ec6a1fa7d5f4dbb3dc0e5b8e5ff82e1", size = 522827, upload-time = "2025-03-16T08:30:18.774Z" },
661
+ { url = "https://files.pythonhosted.org/packages/4f/25/6379dc26714b5a40f51b3c7927d668b00a51517e857da7f3cb09d1d0bcb6/patchelf-0.17.2.2-py3-none-manylinux2014_s390x.manylinux_2_17_s390x.musllinux_1_1_s390x.whl", hash = "sha256:24374cdbd9a072230339024fb6922577cb3231396640610b069f678bc483f21e", size = 565961, upload-time = "2025-03-16T08:30:20.524Z" },
662
+ ]
663
+
492
664
  [[package]]
493
665
  name = "platformdirs"
494
666
  version = "4.3.8"
@@ -805,6 +977,15 @@ wheels = [
805
977
  { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" },
806
978
  ]
807
979
 
980
+ [[package]]
981
+ name = "setuptools"
982
+ version = "80.4.0"
983
+ source = { registry = "https://pypi.org/simple" }
984
+ sdist = { url = "https://files.pythonhosted.org/packages/95/32/0cc40fe41fd2adb80a2f388987f4f8db3c866c69e33e0b4c8b093fdf700e/setuptools-80.4.0.tar.gz", hash = "sha256:5a78f61820bc088c8e4add52932ae6b8cf423da2aff268c23f813cfbb13b4006", size = 1315008, upload-time = "2025-05-09T20:42:27.972Z" }
985
+ wheels = [
986
+ { url = "https://files.pythonhosted.org/packages/b1/93/dba5ed08c2e31ec7cdc2ce75705a484ef0be1a2fecac8a58272489349de8/setuptools-80.4.0-py3-none-any.whl", hash = "sha256:6cdc8cb9a7d590b237dbe4493614a9b75d0559b888047c1f67d49ba50fc3edb2", size = 1200812, upload-time = "2025-05-09T20:42:25.325Z" },
987
+ ]
988
+
808
989
  [[package]]
809
990
  name = "shellingham"
810
991
  version = "1.5.4"
@@ -823,6 +1004,15 @@ wheels = [
823
1004
  { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload-time = "2025-01-02T07:14:38.724Z" },
824
1005
  ]
825
1006
 
1007
+ [[package]]
1008
+ name = "striprtf"
1009
+ version = "0.0.29"
1010
+ source = { registry = "https://pypi.org/simple" }
1011
+ sdist = { url = "https://files.pythonhosted.org/packages/f3/86/7154b7c625a3ff704581dab70c05389e1de90233b7a751f79f712c2ca0e9/striprtf-0.0.29.tar.gz", hash = "sha256:5a822d075e17417934ed3add6fc79b5fc8fb544fe4370b2f894cdd28f0ddd78e", size = 7533, upload-time = "2025-03-27T22:55:56.874Z" }
1012
+ wheels = [
1013
+ { url = "https://files.pythonhosted.org/packages/08/3e/1418afacc4aae04690cff282078f22620c89a99490499878ececc3021654/striprtf-0.0.29-py3-none-any.whl", hash = "sha256:0fc6a41999d015358d19627776b616424dd501ad698105c81d76734d1e14d91b", size = 7879, upload-time = "2025-03-27T22:55:55.977Z" },
1014
+ ]
1015
+
826
1016
  [[package]]
827
1017
  name = "tomli"
828
1018
  version = "2.2.1"
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