FileBackup 0.5.2__tar.gz → 0.5.12__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 (56) hide show
  1. {filebackup-0.5.2 → filebackup-0.5.12}/PKG-INFO +75 -73
  2. {filebackup-0.5.2 → filebackup-0.5.12}/README.md +3 -1
  3. {filebackup-0.5.2 → filebackup-0.5.12}/pyproject.toml +18 -9
  4. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/Impl/Common.py +4 -4
  5. filebackup-0.5.12/src/FileBackup/__init__.py +6 -0
  6. filebackup-0.5.2/.copier-answers.yml +0 -22
  7. filebackup-0.5.2/.github/CODEOWNERS +0 -1
  8. filebackup-0.5.2/.github/ISSUE_TEMPLATE/bug_report.md +0 -32
  9. filebackup-0.5.2/.github/ISSUE_TEMPLATE/config.yml +0 -1
  10. filebackup-0.5.2/.github/ISSUE_TEMPLATE/custom.md +0 -8
  11. filebackup-0.5.2/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  12. filebackup-0.5.2/.github/actions/release_impl/action.yml +0 -121
  13. filebackup-0.5.2/.github/pull_request_template.md +0 -8
  14. filebackup-0.5.2/.github/release_sources.yaml +0 -6
  15. filebackup-0.5.2/.github/workflows/CICD.yml +0 -38
  16. filebackup-0.5.2/.github/workflows/CICD_impl.yml +0 -348
  17. filebackup-0.5.2/.github/workflows/codeql.yml +0 -87
  18. filebackup-0.5.2/.gitignore +0 -16
  19. filebackup-0.5.2/.pre-commit-config.yaml +0 -26
  20. filebackup-0.5.2/.python-version +0 -1
  21. filebackup-0.5.2/BuildBinary.py +0 -163
  22. filebackup-0.5.2/CODE_OF_CONDUCT.md +0 -43
  23. filebackup-0.5.2/CONTRIBUTING.md +0 -26
  24. filebackup-0.5.2/DEVELOPMENT.md +0 -28
  25. filebackup-0.5.2/GOVERNANCE.md +0 -3
  26. filebackup-0.5.2/LICENSE +0 -21
  27. filebackup-0.5.2/MAINTAINERS.md +0 -37
  28. filebackup-0.5.2/SECURITY.md +0 -29
  29. filebackup-0.5.2/minisign_key.pub +0 -2
  30. filebackup-0.5.2/src/AutoGitSemVer.yaml +0 -8
  31. filebackup-0.5.2/src/FileBackup/__init__.py +0 -8
  32. filebackup-0.5.2/tests/CommandLine/EntryPoint_UnitTest.py +0 -520
  33. filebackup-0.5.2/tests/Mirror_UnitTest.py +0 -1510
  34. filebackup-0.5.2/tests/Offsite_UnitTest.py +0 -1696
  35. filebackup-0.5.2/tests/Snapshot_UnitTest.py +0 -1416
  36. filebackup-0.5.2/tests/TestHelpers.py +0 -206
  37. filebackup-0.5.2/uv.lock +0 -1183
  38. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/CommandLine/CommandLineArguments.py +0 -0
  39. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/CommandLine/EntryPoint.py +0 -0
  40. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/CommandLine/MirrorEntryPoint.py +0 -0
  41. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/CommandLine/OffsiteEntryPoint.py +0 -0
  42. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/CommandLine/__init__.py +0 -0
  43. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/FastGlacierDataStore.py +0 -0
  44. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/FileSystemDataStore.py +0 -0
  45. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/Interfaces/BulkStorageDataStore.py +0 -0
  46. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/Interfaces/DataStore.py +0 -0
  47. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/Interfaces/FileBasedDataStore.py +0 -0
  48. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/Interfaces/__init__.py +0 -0
  49. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/S3BrowserDataStore.py +0 -0
  50. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/SFTPDataStore.py +0 -0
  51. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/__init__.py +0 -0
  52. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/Impl/__init__.py +0 -0
  53. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/Mirror.py +0 -0
  54. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/Offsite.py +0 -0
  55. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/Snapshot.py +0 -0
  56. {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/py.typed +0 -0
@@ -1,14 +1,11 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.3
2
2
  Name: FileBackup
3
- Version: 0.5.2
3
+ Version: 0.5.12
4
4
  Summary: Tool for creating and restoring file system backups.
5
- Project-URL: Homepage, https://github.com/davidbrownell/FileBackup
6
- Project-URL: Documentation, https://github.com/davidbrownell/FileBackup
7
- Project-URL: Repository, https://github.com/davidbrownell/FileBackup
8
- Author-email: David Brownell <github@DavidBrownell.com>
9
- License-Expression: MIT
10
- License-File: LICENSE
11
5
  Keywords: backup,mirror,offsite,restore
6
+ Author: David Brownell
7
+ Author-email: David Brownell <github@DavidBrownell.com>
8
+ License: MIT
12
9
  Classifier: Development Status :: 4 - Beta
13
10
  Classifier: Environment :: Console
14
11
  Classifier: Intended Audience :: Developers
@@ -27,73 +24,78 @@ Classifier: Topic :: System :: Archiving :: Backup
27
24
  Classifier: Topic :: System :: Archiving :: Mirroring
28
25
  Classifier: Topic :: System :: Systems Administration
29
26
  Classifier: Topic :: Utilities
30
- Requires-Python: >=3.10
31
27
  Requires-Dist: dbrownell-common>=0.15.0
32
28
  Requires-Dist: paramiko>=3.5.1
33
29
  Requires-Dist: typer>=0.15.3
30
+ Requires-Python: >=3.10
31
+ Project-URL: Homepage, https://github.com/davidbrownell/FileBackup
32
+ Project-URL: Documentation, https://github.com/davidbrownell/FileBackup
33
+ Project-URL: Repository, https://github.com/davidbrownell/FileBackup
34
34
  Description-Content-Type: text/markdown
35
35
 
36
- **Project:**
37
- [![License](https://img.shields.io/github/license/davidbrownell/FileBackup?color=dark-green)](https://github.com/davidbrownell/FileBackup/blob/master/LICENSE)
38
-
39
- **Package:**
40
- [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/FileBackup?color=dark-green)](https://pypi.org/project/FileBackup/)
41
- [![PyPI - Version](https://img.shields.io/pypi/v/FileBackup?color=dark-green)](https://pypi.org/project/FileBackup/)
42
- [![PyPI - Downloads](https://img.shields.io/pypi/dm/FileBackup)](https://pypistats.org/packages/FileBackup)
43
-
44
- **Development:**
45
- [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
46
- [![CI](https://github.com/davidbrownell/FileBackup/actions/workflows/CICD.yml/badge.svg)](https://github.com/davidbrownell/FileBackup/actions/workflows/CICD.yml)
47
- [![Code Coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/davidbrownell/f15146b1b8fdc0a5d45ac0eb786a84f7/raw/FileBackup_code_coverage.json)](https://github.com/davidbrownell/FileBackup/actions)
48
- [![GitHub commit activity](https://img.shields.io/github/commit-activity/y/davidbrownell/FileBackup?color=dark-green)](https://github.com/davidbrownell/FileBackup/commits/main/)
49
-
50
- <!-- Content above this delimiter will be copied to the generated README.md file. DO NOT REMOVE THIS COMMENT, as it will cause regeneration to fail. -->
51
-
52
- ## Contents
53
- - [Overview](#overview)
54
- - [Installation](#installation)
55
- - [Development](#development)
56
- - [Additional Information](#additional-information)
57
- - [License](#license)
58
-
59
- ## Overview
60
- TODO: Complete this section
61
-
62
- ### How to use `FileBackup`
63
- TODO: Complete this section
64
-
65
- <!-- Content below this delimiter will be copied to the generated README.md file. DO NOT REMOVE THIS COMMENT, as it will cause regeneration to fail. -->
66
-
67
- ## Installation
68
-
69
- | Installation Method | Command |
70
- | --- | --- |
71
- | Via [uv](https://github.com/astral-sh/uv) | `uv add FileBackup` |
72
- | Via [pip](https://pip.pypa.io/en/stable/) | `pip install FileBackup` |
73
-
74
- ### Verifying Signed Artifacts
75
- Artifacts are signed and verified using [py-minisign](https://github.com/x13a/py-minisign) and the public key in the file `./minisign_key.pub`.
76
-
77
- To verify that an artifact is valid, visit [the latest release](https://github.com/davidbrownell/FileBackup/releases/latest) and download the `.minisign` signature file that corresponds to the artifact, then run the following command, replacing `<filename>` with the name of the artifact to be verified:
78
-
79
- ```shell
80
- uv run --with py-minisign python -c "import minisign; minisign.PublicKey.from_file('minisign_key.pub').verify_file('<filename>'); print('The file has been verified.')"
81
- ```
82
-
83
- ## Development
84
- Please visit [Contributing](https://github.com/davidbrownell/FileBackup/blob/main/CONTRIBUTING.md) and [Development](https://github.com/davidbrownell/FileBackup/blob/main/DEVELOPMENT.md) for information on contributing to this project.
85
-
86
- ## Additional Information
87
- Additional information can be found at these locations.
88
-
89
- | Title | Document | Description |
90
- | --- | --- | --- |
91
- | Code of Conduct | [CODE_OF_CONDUCT.md](https://github.com/davidbrownell/FileBackup/blob/main/CODE_OF_CONDUCT.md) | Information about the norms, rules, and responsibilities we adhere to when participating in this open source community. |
92
- | Contributing | [CONTRIBUTING.md](https://github.com/davidbrownell/FileBackup/blob/main/CONTRIBUTING.md) | Information about contributing to this project. |
93
- | Development | [DEVELOPMENT.md](https://github.com/davidbrownell/FileBackup/blob/main/DEVELOPMENT.md) | Information about development activities involved in making changes to this project. |
94
- | Governance | [GOVERNANCE.md](https://github.com/davidbrownell/FileBackup/blob/main/GOVERNANCE.md) | Information about how this project is governed. |
95
- | Maintainers | [MAINTAINERS.md](https://github.com/davidbrownell/FileBackup/blob/main/MAINTAINERS.md) | Information about individuals who maintain this project. |
96
- | Security | [SECURITY.md](https://github.com/davidbrownell/FileBackup/blob/main/SECURITY.md) | Information about how to privately report security issues associated with this project. |
97
-
98
- ## License
99
- `FileBackup` is licensed under the <a href="https://choosealicense.com/licenses/MIT/" target="_blank">MIT</a> license.
36
+ **Project:**
37
+ [![License](https://img.shields.io/github/license/davidbrownell/FileBackup?color=dark-green)](https://github.com/davidbrownell/FileBackup/blob/master/LICENSE)
38
+
39
+ **Package:**
40
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/FileBackup?color=dark-green)](https://pypi.org/project/FileBackup/)
41
+ [![PyPI - Version](https://img.shields.io/pypi/v/FileBackup?color=dark-green)](https://pypi.org/project/FileBackup/)
42
+ [![PyPI - Downloads](https://img.shields.io/pypi/dm/FileBackup)](https://pypistats.org/packages/filebackup)
43
+
44
+ **Development:**
45
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
46
+ [![ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
47
+ [![pytest](https://img.shields.io/badge/pytest-enabled-brightgreen)](https://docs.pytest.org/)
48
+ [![CI](https://github.com/davidbrownell/FileBackup/actions/workflows/CICD.yml/badge.svg)](https://github.com/davidbrownell/FileBackup/actions/workflows/CICD.yml)
49
+ [![Code Coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/davidbrownell/f15146b1b8fdc0a5d45ac0eb786a84f7/raw/FileBackup_code_coverage.json)](https://github.com/davidbrownell/FileBackup/actions)
50
+ [![GitHub commit activity](https://img.shields.io/github/commit-activity/y/davidbrownell/FileBackup?color=dark-green)](https://github.com/davidbrownell/FileBackup/commits/main/)
51
+
52
+ <!-- Content above this delimiter will be copied to the generated README.md file. DO NOT REMOVE THIS COMMENT, as it will cause regeneration to fail. -->
53
+
54
+ ## Contents
55
+ - [Overview](#overview)
56
+ - [Installation](#installation)
57
+ - [Development](#development)
58
+ - [Additional Information](#additional-information)
59
+ - [License](#license)
60
+
61
+ ## Overview
62
+ TODO: Complete this section
63
+
64
+ ### How to use `FileBackup`
65
+ TODO: Complete this section
66
+
67
+ <!-- Content below this delimiter will be copied to the generated README.md file. DO NOT REMOVE THIS COMMENT, as it will cause regeneration to fail. -->
68
+
69
+ ## Installation
70
+
71
+ | Installation Method | Command |
72
+ | --- | --- |
73
+ | Via [uv](https://github.com/astral-sh/uv) | `uv add FileBackup` |
74
+ | Via [pip](https://pip.pypa.io/en/stable/) | `pip install FileBackup` |
75
+
76
+ ### Verifying Signed Artifacts
77
+ Artifacts are signed and verified using [py-minisign](https://github.com/x13a/py-minisign) and the public key in the file `./minisign_key.pub`.
78
+
79
+ To verify that an artifact is valid, visit [the latest release](https://github.com/davidbrownell/FileBackup/releases/latest) and download the `.minisign` signature file that corresponds to the artifact, then run the following command, replacing `<filename>` with the name of the artifact to be verified:
80
+
81
+ ```shell
82
+ uv run --with py-minisign python -c "import minisign; minisign.PublicKey.from_file('minisign_key.pub').verify_file('<filename>'); print('The file has been verified.')"
83
+ ```
84
+
85
+ ## Development
86
+ Please visit [Contributing](https://github.com/davidbrownell/FileBackup/blob/main/CONTRIBUTING.md) and [Development](https://github.com/davidbrownell/FileBackup/blob/main/DEVELOPMENT.md) for information on contributing to this project.
87
+
88
+ ## Additional Information
89
+ Additional information can be found at these locations.
90
+
91
+ | Title | Document | Description |
92
+ | --- | --- | --- |
93
+ | Code of Conduct | [CODE_OF_CONDUCT.md](https://github.com/davidbrownell/FileBackup/blob/main/CODE_OF_CONDUCT.md) | Information about the norms, rules, and responsibilities we adhere to when participating in this open source community. |
94
+ | Contributing | [CONTRIBUTING.md](https://github.com/davidbrownell/FileBackup/blob/main/CONTRIBUTING.md) | Information about contributing to this project. |
95
+ | Development | [DEVELOPMENT.md](https://github.com/davidbrownell/FileBackup/blob/main/DEVELOPMENT.md) | Information about development activities involved in making changes to this project. |
96
+ | Governance | [GOVERNANCE.md](https://github.com/davidbrownell/FileBackup/blob/main/GOVERNANCE.md) | Information about how this project is governed. |
97
+ | Maintainers | [MAINTAINERS.md](https://github.com/davidbrownell/FileBackup/blob/main/MAINTAINERS.md) | Information about individuals who maintain this project. |
98
+ | Security | [SECURITY.md](https://github.com/davidbrownell/FileBackup/blob/main/SECURITY.md) | Information about how to privately report security issues associated with this project. |
99
+
100
+ ## License
101
+ `FileBackup` is licensed under the <a href="https://choosealicense.com/licenses/MIT/" target="_blank">MIT</a> license.
@@ -4,10 +4,12 @@
4
4
  **Package:**
5
5
  [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/FileBackup?color=dark-green)](https://pypi.org/project/FileBackup/)
6
6
  [![PyPI - Version](https://img.shields.io/pypi/v/FileBackup?color=dark-green)](https://pypi.org/project/FileBackup/)
7
- [![PyPI - Downloads](https://img.shields.io/pypi/dm/FileBackup)](https://pypistats.org/packages/FileBackup)
7
+ [![PyPI - Downloads](https://img.shields.io/pypi/dm/FileBackup)](https://pypistats.org/packages/filebackup)
8
8
 
9
9
  **Development:**
10
10
  [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
11
+ [![ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
12
+ [![pytest](https://img.shields.io/badge/pytest-enabled-brightgreen)](https://docs.pytest.org/)
11
13
  [![CI](https://github.com/davidbrownell/FileBackup/actions/workflows/CICD.yml/badge.svg)](https://github.com/davidbrownell/FileBackup/actions/workflows/CICD.yml)
12
14
  [![Code Coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/davidbrownell/f15146b1b8fdc0a5d45ac0eb786a84f7/raw/FileBackup_code_coverage.json)](https://github.com/davidbrownell/FileBackup/actions)
13
15
  [![GitHub commit activity](https://img.shields.io/github/commit-activity/y/davidbrownell/FileBackup?color=dark-green)](https://github.com/davidbrownell/FileBackup/commits/main/)
@@ -1,5 +1,12 @@
1
1
  [project]
2
2
  name = "FileBackup"
3
+ version = "0.5.12"
4
+ # ^^^^^
5
+ # Wheel names will be generated according to this value. Do not manually modify this value; instead
6
+ # update it according to committed changes by running this command from the root of the repository:
7
+ #
8
+ # uv run python -m AutoGitSemVer.scripts.UpdatePythonVersion ./pyproject.toml ./src
9
+
3
10
  description = "Tool for creating and restoring file system backups."
4
11
  readme = "README.md"
5
12
  authors = [
@@ -11,7 +18,6 @@ dependencies = [
11
18
  "paramiko>=3.5.1",
12
19
  "typer>=0.15.3",
13
20
  ]
14
- dynamic = ["version"]
15
21
 
16
22
  keywords = [
17
23
  "backup",
@@ -20,8 +26,6 @@ keywords = [
20
26
  "restore",
21
27
  ]
22
28
 
23
- license = "MIT"
24
-
25
29
  classifiers = [
26
30
  "Development Status :: 4 - Beta",
27
31
  "Environment :: Console",
@@ -43,6 +47,9 @@ classifiers = [
43
47
  "Topic :: Utilities",
44
48
  ]
45
49
 
50
+ [project.license]
51
+ text = "MIT"
52
+
46
53
  [project.urls]
47
54
  Homepage = "https://github.com/davidbrownell/FileBackup"
48
55
  Documentation = "https://github.com/davidbrownell/FileBackup"
@@ -53,12 +60,12 @@ FileBackup = "FileBackup.CommandLine:EntryPoint.app"
53
60
  file_backup = "FileBackup.CommandLine:EntryPoint.app"
54
61
 
55
62
  [build-system]
56
- requires = ["hatchling"]
57
- build-backend = "hatchling.build"
63
+ requires = ["uv_build>=0.11.19,<0.12.0"]
64
+ build-backend = "uv_build"
58
65
 
59
66
  [dependency-groups]
60
67
  dev = [
61
- "autogitsemver>=0.8.4",
68
+ "autogitsemver>=0.9.2",
62
69
  "cx-freeze>=8.3.0",
63
70
  "dbrownell-commitemojis>=0.1.4",
64
71
  "pre-commit>=4.2.0",
@@ -68,9 +75,6 @@ dev = [
68
75
  "ruff>=0.12.3",
69
76
  ]
70
77
 
71
- [tool.hatch.version]
72
- path = "src/FileBackup/__init__.py"
73
-
74
78
  [tool.pytest.ini_options]
75
79
  addopts = "--verbose -vv --capture=no --cov=FileBackup --cov-report term --cov-report xml:coverage.xml --cov-fail-under=85.0"
76
80
  python_files = [
@@ -91,6 +95,8 @@ ignore = [
91
95
  "D105", # Missing docstring in magic method
92
96
  "D107", # Missing docstring in `__init__` method
93
97
  "D202", # No blank lines allowed after function docstring
98
+ "D203", # Incorrect blank line before class docstring
99
+ "D213", # Multi line summary second line
94
100
  "E501", # Line too long
95
101
  "FIX002", # Line contains TODO, consider resolving the issue
96
102
  "I001", # Import block is un-sorted or un-formatted
@@ -113,3 +119,6 @@ max-complexity = 15
113
119
  max-args = 10
114
120
  max-branches = 20
115
121
  max-returns = 20
122
+
123
+ [tool.uv.build-backend]
124
+ module-name = "FileBackup"
@@ -291,7 +291,7 @@ def GetDestinationHelp() -> str:
291
291
  Writes content to a SFTP server.
292
292
 
293
293
  Format:
294
- ftp://<username>:<password or posix path to private key>@<host>[:<port>][/<working_dir>]
294
+ ftp://<username>:<password or posix path to private key>@<host>\\[:<port>]\\[/<working_dir>]
295
295
 
296
296
  Examples:
297
297
  ftp://my_username:my_password@my_server.com
@@ -304,7 +304,7 @@ def GetDestinationHelp() -> str:
304
304
  Write content using the Fast Glacier application (https://fastglacier.com/).
305
305
 
306
306
  Format:
307
- fast_glacier://<fast_glacier_account_name>@<aws_region>[/<glacier_dir>]
307
+ fast_glacier://<fast_glacier_account_name>@<aws_region>\\[/<glacier_dir>]
308
308
 
309
309
  Examples:
310
310
  fast_glacier://MyFastGlacierAccount@us-west-2
@@ -315,7 +315,7 @@ def GetDestinationHelp() -> str:
315
315
  Write content using the S3 Browser application (https://s3browser.com/).
316
316
 
317
317
  Format:
318
- s3_browser://<s3_browser_account_name>@<bucket_name>[/<working_dir>]
318
+ s3_browser://<s3_browser_account_name>@<bucket_name>\\[/<working_dir>]
319
319
 
320
320
  Examples:
321
321
  s3_browser://MyS3BrowserAccount@MyBucket
@@ -341,7 +341,7 @@ def YieldDataStore(
341
341
 
342
342
  private_key_filename = Path(private_key_or_password)
343
343
  if private_key_filename.is_file():
344
- private_key_or_password = private_key_filename.read_text()
344
+ private_key_or_password = private_key_filename
345
345
 
346
346
  working_dir = sftp_match.group("working_dir")
347
347
  if working_dir:
@@ -0,0 +1,6 @@
1
+ # noqa: D104
2
+
3
+ from importlib.metadata import version
4
+
5
+
6
+ __version__ = version("FileBackup")
@@ -1,22 +0,0 @@
1
- # Changes here will be overwritten by Copier; DO NOT MODIFY THIS FILE DIRECTLY!
2
- #
3
- # This file was generated using copier (https://copier.readthedocs.io/) with the
4
- # template copier-UvScaffolding (https://github.com/gt-sse-center/copier-UvScaffolding).
5
- # Additional information (including instructions on how to use this template with copier) is
6
- # available at https://github.com/gt-sse-center/copier-UvScaffolding.
7
- #
8
-
9
- _commit: v0.2.4
10
- _src_path: .
11
- author_email: github@DavidBrownell.com
12
- author_name: David Brownell
13
- coverage_badge_gist_id: f15146b1b8fdc0a5d45ac0eb786a84f7
14
- coverage_badge_gist_username: davidbrownell
15
- github_host: https://github.com
16
- github_repo_name: FileBackup
17
- github_username: davidbrownell
18
- license: MIT
19
- project_name: FileBackup
20
- python_package_name: FileBackup
21
- python_versions: 3.10, 3.11, 3.12, 3.13
22
- sign_artifacts_question: true
@@ -1 +0,0 @@
1
- * @davidbrownell
@@ -1,32 +0,0 @@
1
- ---
2
- name: Bug report
3
- about: Create a report to help us improve.
4
- title: ''
5
- labels: ''
6
- assignees: ''
7
-
8
- ---
9
-
10
- ## Describe the bug
11
- A clear and concise description of what the bug is.
12
-
13
- ## To Reproduce
14
- Steps to reproduce the behavior:
15
- 1. Go to '...'
16
- 2. Click on '....'
17
- 3. Scroll down to '....'
18
- 4. See error
19
-
20
- ## Expected behavior
21
- A clear and concise description of what you expected to happen.
22
-
23
- ## Screenshots
24
- If applicable, add screenshots to help explain your problem.
25
-
26
- ## Environment (please complete the following information):
27
- - OS: [e.g. iOS]
28
- - Python Version: [e.g. 3.13, 3.12, 3.11, etc.]
29
- - dbrownell_DevTools Version [e.g. 1.2.3]
30
-
31
- ## Additional context
32
- Add any other context about the problem here.
@@ -1 +0,0 @@
1
- blank_issues_enabled: false
@@ -1,8 +0,0 @@
1
- ---
2
- name: Custom issue template
3
- about: Create an issue that isn't a bug or feature request.
4
- title: ''
5
- labels: ''
6
- assignees: ''
7
-
8
- ---
@@ -1,20 +0,0 @@
1
- ---
2
- name: Feature request
3
- about: Suggest an idea for this project.
4
- title: ''
5
- labels: ''
6
- assignees: ''
7
-
8
- ---
9
-
10
- ## Is your feature request related to a problem? Please describe.
11
- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
-
13
- ## Describe the solution you'd like
14
- A clear and concise description of what you want to happen.
15
-
16
- ## Describe alternatives you've considered
17
- A clear and concise description of any alternative solutions or features you've considered.
18
-
19
- ## Additional context
20
- Add any other context or screenshots about the feature request here.
@@ -1,121 +0,0 @@
1
- name: "[impl] Release"
2
- description: "Releases the current repository."
3
-
4
- # spell-checker: words jedisct, minisig, minisign, pypi, schneegans
5
-
6
- inputs:
7
- minisign_private_key:
8
- description: "Key used to sign dist artifacts. No signatures will be created if the key is empty."
9
- required: false
10
- default: ""
11
-
12
- pypi_publish_token:
13
- description: "Token used to publish the package to PyPI."
14
- required: false
15
- default: ""
16
-
17
- coverage_badge_gist_token:
18
- description: "Gist token used to store the code coverage badge."
19
- default: ""
20
-
21
- coverage_badge_gist_id:
22
- description: "Gist ID used to store the code coverage badge."
23
- required: false
24
- default: ""
25
-
26
- coverage_badge_gist_username:
27
- description: "Gist username used to store the code coverage badge. The current GitHub user will be used if this value is not provided."
28
- required: false
29
- default: ""
30
-
31
- runs:
32
- using: composite
33
- steps:
34
- - name: Install uv and python
35
- uses: astral-sh/setup-uv@v5
36
- with:
37
- enable-cache: false # No uv.lock or requirements.txt files, so nothing to cache on
38
-
39
- - name: Download Artifacts
40
- uses: actions/download-artifact@v4
41
- with:
42
- path: dist
43
- merge-multiple: true
44
-
45
- - name: Remove Coverage Files Artifacts
46
- shell: bash
47
- run: rm dist/.coverage*
48
-
49
- # Create repository tag
50
- - name: Create Repository Tag
51
- shell: bash
52
- run: |-
53
- git config user.name "GitHub Action Bot"
54
- git config user.email "<>"
55
-
56
- git tag --annotate --force -m "Publish Tag" "v${{ env.PACKAGE_VERSION }}" "${{ github.sha }}"
57
- git push origin "v${{ env.PACKAGE_VERSION }}" --force
58
-
59
- # Commit code coverage
60
- - name: Create Code Coverage Badge
61
- if: ${{ inputs.coverage_badge_gist_token != '' && inputs.coverage_badge_gist_id != '' }}
62
- uses: schneegans/dynamic-badges-action@v1.7.0
63
- with:
64
- auth: ${{ inputs.coverage_badge_gist_token }}
65
- gistID: ${{ inputs.coverage_badge_gist_id }}
66
- filename: ${{ github.event.repository.name }}_code_coverage.json
67
- label: Coverage
68
- message: ${{ env.COVERAGE_TOTAL }}%
69
- valColorRange: ${{ env.COVERAGE_TOTAL }}
70
- minColorRange: 50
71
- maxColorRange: 90
72
-
73
- - name: Display Code Coverage Badge Url
74
- if: ${{ inputs.coverage_badge_gist_token != '' && inputs.coverage_badge_gist_id != '' }}
75
- shell: bash
76
- run: |-
77
- username="${{ inputs.coverage_badge_gist_username }}"
78
- if [ -z "${username}" ]; then
79
- username="${{ github.repository_owner }}"
80
- fi
81
-
82
- echo "**Code Coverage Badge:** [![Code Coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/${username}/${{ inputs.coverage_badge_gist_id }}/raw/${{ github.event.repository.name }}_code_coverage.json)](${{ github.server_url }}/${{ github.repository_owner }}/${{ github.event.repository.name }}/actions)" >> $GITHUB_STEP_SUMMARY
83
- echo "**Code Coverage Badge Markdown:** <code>\[!\[Code Coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/${username}/${{ inputs.coverage_badge_gist_id }}/raw/${{ github.event.repository.name }}_code_coverage.json)](${{ github.server_url }}/${{ github.repository_owner }}/${{ github.event.repository.name }}/actions)</code>" >> $GITHUB_STEP_SUMMARY
84
-
85
- # Sign artifacts
86
- - name: Sign Artifacts
87
- if: ${{ inputs.minisign_private_key != '' }}
88
- shell: bash
89
- run: |-
90
- pushd dist
91
-
92
- echo "**Signed Artifacts:**" >> $GITHUB_STEP_SUMMARY
93
-
94
- echo "${{ inputs.minisign_private_key }}" > /tmp/minisign.key
95
-
96
- for filename in *; do
97
- echo "- ${filename} [${filename}.minisig]" >> $GITHUB_STEP_SUMMARY
98
- uv run --with py-minisign python -c "import minisign; minisign.SecretKey.from_file('/tmp/minisign.key').sign_file('${filename}', trusted_comment='${{ env.PACKAGE_NAME }} v${{ env.PACKAGE_VERSION }}', drop_signature=True)"
99
- done
100
-
101
- rm /tmp/minisign.key
102
-
103
- - name: Upload Signatures
104
- if: ${{ inputs.minisign_private_key != '' }}
105
- uses: actions/upload-artifact@v4
106
- with:
107
- name: Minisign signatures
108
- path: ./dist/*.minisig
109
-
110
- # Create the GitHub release
111
- - name: Create GitHub Release
112
- shell: bash
113
- run: |-
114
- gh release create "v${{ env.PACKAGE_VERSION }}" ./dist/* --generate-notes
115
-
116
- # Publish Python Package
117
- - name: Publish Python Package
118
- if: ${{ inputs.pypi_publish_token != '' }}
119
- shell: bash
120
- run: |-
121
- uv publish --token "${{ inputs.pypi_publish_token }}" --verbose
@@ -1,8 +0,0 @@
1
- ## :pencil: Description
2
- Please include a summary of the change.
3
-
4
- ## :gear: Work Item
5
- Please include link to the corresponding GitHub Issue or Project work item.
6
-
7
- ## :movie_camera: Demo
8
- Please provide any images, GIFs, or videos that show the effect of your changes (if applicable). A picture is worth a thousand words.
@@ -1,6 +0,0 @@
1
- # Changes to any of these files or a file within these directories will trigger a release.
2
- src:
3
- - 'src/**'
4
- - 'pyproject.toml'
5
- - 'README.md'
6
- - 'uv.lock'
@@ -1,38 +0,0 @@
1
- name: "CI+CD"
2
- run-name: ${{ github.run_number }} [${{ github.actor }}] on ${{ github.ref_name }}
3
-
4
- on:
5
- pull_request:
6
- branches:
7
- - main
8
- push:
9
- branches:
10
- - main
11
- schedule:
12
- - cron: '0 0 * * *' # Once a day at 12am UTC
13
- workflow_dispatch:
14
-
15
- permissions: {}
16
-
17
- jobs:
18
- CICD_Workflow:
19
- name: "CI+CD Workflow"
20
-
21
- permissions:
22
- contents: write
23
-
24
- uses: ./.github/workflows/CICD_impl.yml
25
-
26
- with:
27
- # These values can be customized for your specific requirements.
28
- operating_system_json_string: "[ 'macos-latest', 'ubuntu-latest', 'windows-latest' ]"
29
- python_version_json_string: "['3.13', '3.12', '3.11', '3.10']"
30
- python_package_version: "3.10"
31
- coverage_badge_gist_id: "f15146b1b8fdc0a5d45ac0eb786a84f7"
32
- coverage_badge_gist_username: "davidbrownell"
33
-
34
- secrets:
35
- # These values should be populated as GitHub Action secrets (https://github.com/davidbrownell/FileBackup/settings/secrets/actions)
36
- MINISIGN_PRIVATE_KEY: ${{ secrets.MINISIGN_PRIVATE_KEY }}
37
- PYPI_PUBLISH_TOKEN: ${{ secrets.PYPI_PUBLISH_TOKEN }}
38
- COVERAGE_BADGE_GIST_TOKEN: ${{ secrets.COVERAGE_BADGE_GIST_TOKEN }}