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.
- {filebackup-0.5.2 → filebackup-0.5.12}/PKG-INFO +75 -73
- {filebackup-0.5.2 → filebackup-0.5.12}/README.md +3 -1
- {filebackup-0.5.2 → filebackup-0.5.12}/pyproject.toml +18 -9
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/Impl/Common.py +4 -4
- filebackup-0.5.12/src/FileBackup/__init__.py +6 -0
- filebackup-0.5.2/.copier-answers.yml +0 -22
- filebackup-0.5.2/.github/CODEOWNERS +0 -1
- filebackup-0.5.2/.github/ISSUE_TEMPLATE/bug_report.md +0 -32
- filebackup-0.5.2/.github/ISSUE_TEMPLATE/config.yml +0 -1
- filebackup-0.5.2/.github/ISSUE_TEMPLATE/custom.md +0 -8
- filebackup-0.5.2/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- filebackup-0.5.2/.github/actions/release_impl/action.yml +0 -121
- filebackup-0.5.2/.github/pull_request_template.md +0 -8
- filebackup-0.5.2/.github/release_sources.yaml +0 -6
- filebackup-0.5.2/.github/workflows/CICD.yml +0 -38
- filebackup-0.5.2/.github/workflows/CICD_impl.yml +0 -348
- filebackup-0.5.2/.github/workflows/codeql.yml +0 -87
- filebackup-0.5.2/.gitignore +0 -16
- filebackup-0.5.2/.pre-commit-config.yaml +0 -26
- filebackup-0.5.2/.python-version +0 -1
- filebackup-0.5.2/BuildBinary.py +0 -163
- filebackup-0.5.2/CODE_OF_CONDUCT.md +0 -43
- filebackup-0.5.2/CONTRIBUTING.md +0 -26
- filebackup-0.5.2/DEVELOPMENT.md +0 -28
- filebackup-0.5.2/GOVERNANCE.md +0 -3
- filebackup-0.5.2/LICENSE +0 -21
- filebackup-0.5.2/MAINTAINERS.md +0 -37
- filebackup-0.5.2/SECURITY.md +0 -29
- filebackup-0.5.2/minisign_key.pub +0 -2
- filebackup-0.5.2/src/AutoGitSemVer.yaml +0 -8
- filebackup-0.5.2/src/FileBackup/__init__.py +0 -8
- filebackup-0.5.2/tests/CommandLine/EntryPoint_UnitTest.py +0 -520
- filebackup-0.5.2/tests/Mirror_UnitTest.py +0 -1510
- filebackup-0.5.2/tests/Offsite_UnitTest.py +0 -1696
- filebackup-0.5.2/tests/Snapshot_UnitTest.py +0 -1416
- filebackup-0.5.2/tests/TestHelpers.py +0 -206
- filebackup-0.5.2/uv.lock +0 -1183
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/CommandLine/CommandLineArguments.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/CommandLine/EntryPoint.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/CommandLine/MirrorEntryPoint.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/CommandLine/OffsiteEntryPoint.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/CommandLine/__init__.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/FastGlacierDataStore.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/FileSystemDataStore.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/Interfaces/BulkStorageDataStore.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/Interfaces/DataStore.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/Interfaces/FileBasedDataStore.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/Interfaces/__init__.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/S3BrowserDataStore.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/SFTPDataStore.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/DataStore/__init__.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/Impl/__init__.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/Mirror.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/Offsite.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/Snapshot.py +0 -0
- {filebackup-0.5.2 → filebackup-0.5.12}/src/FileBackup/py.typed +0 -0
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: FileBackup
|
|
3
|
-
Version: 0.5.
|
|
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
|
-
[](https://github.com/davidbrownell/FileBackup/blob/master/LICENSE)
|
|
38
|
-
|
|
39
|
-
**Package:**
|
|
40
|
-
[](https://pypi.org/project/FileBackup/)
|
|
41
|
-
[](https://pypi.org/project/FileBackup/)
|
|
42
|
-
[](https://pypistats.org/packages/
|
|
43
|
-
|
|
44
|
-
**Development:**
|
|
45
|
-
[](https://github.com/astral-sh/uv)
|
|
46
|
-
[](https://github.com/davidbrownell/FileBackup/blob/master/LICENSE)
|
|
38
|
+
|
|
39
|
+
**Package:**
|
|
40
|
+
[](https://pypi.org/project/FileBackup/)
|
|
41
|
+
[](https://pypi.org/project/FileBackup/)
|
|
42
|
+
[](https://pypistats.org/packages/filebackup)
|
|
43
|
+
|
|
44
|
+
**Development:**
|
|
45
|
+
[](https://github.com/astral-sh/uv)
|
|
46
|
+
[](https://github.com/astral-sh/ruff)
|
|
47
|
+
[](https://docs.pytest.org/)
|
|
48
|
+
[](https://github.com/davidbrownell/FileBackup/actions/workflows/CICD.yml)
|
|
49
|
+
[](https://github.com/davidbrownell/FileBackup/actions)
|
|
50
|
+
[](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
|
[](https://pypi.org/project/FileBackup/)
|
|
6
6
|
[](https://pypi.org/project/FileBackup/)
|
|
7
|
-
[](https://pypistats.org/packages/
|
|
7
|
+
[](https://pypistats.org/packages/filebackup)
|
|
8
8
|
|
|
9
9
|
**Development:**
|
|
10
10
|
[](https://github.com/astral-sh/uv)
|
|
11
|
+
[](https://github.com/astral-sh/ruff)
|
|
12
|
+
[](https://docs.pytest.org/)
|
|
11
13
|
[](https://github.com/davidbrownell/FileBackup/actions/workflows/CICD.yml)
|
|
12
14
|
[](https://github.com/davidbrownell/FileBackup/actions)
|
|
13
15
|
[](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 = ["
|
|
57
|
-
build-backend = "
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
344
|
+
private_key_or_password = private_key_filename
|
|
345
345
|
|
|
346
346
|
working_dir = sftp_match.group("working_dir")
|
|
347
347
|
if working_dir:
|
|
@@ -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,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:** [](${{ 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,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 }}
|