PyHardLinkBackup 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. pyhardlinkbackup-1.0.0/.editorconfig +20 -0
  2. pyhardlinkbackup-1.0.0/.github/workflows/tests.yml +72 -0
  3. pyhardlinkbackup-1.0.0/.gitignore +15 -0
  4. pyhardlinkbackup-1.0.0/.idea/.gitignore +3 -0
  5. pyhardlinkbackup-1.0.0/.pre-commit-config.yaml +7 -0
  6. pyhardlinkbackup-1.0.0/.pre-commit-hooks.yaml +13 -0
  7. pyhardlinkbackup-1.0.0/.run/Template Python tests.run.xml +24 -0
  8. pyhardlinkbackup-1.0.0/.run/Unittests - __all__.run.xml +22 -0
  9. pyhardlinkbackup-1.0.0/.run/cli.py --help.run.xml +25 -0
  10. pyhardlinkbackup-1.0.0/.run/dev-cli update.run.xml +26 -0
  11. pyhardlinkbackup-1.0.0/.run/only DocTests.run.xml +23 -0
  12. pyhardlinkbackup-1.0.0/.run/only DocWrite.run.xml +24 -0
  13. pyhardlinkbackup-1.0.0/.venv-app/lib/python3.12/site-packages/cli_base/tests/shell_complete_snapshots/.gitignore +1 -0
  14. pyhardlinkbackup-1.0.0/PKG-INFO +547 -0
  15. pyhardlinkbackup-1.0.0/PyHardLinkBackup/__init__.py +7 -0
  16. pyhardlinkbackup-1.0.0/PyHardLinkBackup/__main__.py +10 -0
  17. pyhardlinkbackup-1.0.0/PyHardLinkBackup/backup.py +203 -0
  18. pyhardlinkbackup-1.0.0/PyHardLinkBackup/cli_app/__init__.py +41 -0
  19. pyhardlinkbackup-1.0.0/PyHardLinkBackup/cli_app/phlb.py +50 -0
  20. pyhardlinkbackup-1.0.0/PyHardLinkBackup/cli_dev/__init__.py +70 -0
  21. pyhardlinkbackup-1.0.0/PyHardLinkBackup/cli_dev/benchmark.py +119 -0
  22. pyhardlinkbackup-1.0.0/PyHardLinkBackup/cli_dev/code_style.py +12 -0
  23. pyhardlinkbackup-1.0.0/PyHardLinkBackup/cli_dev/packaging.py +65 -0
  24. pyhardlinkbackup-1.0.0/PyHardLinkBackup/cli_dev/shell_completion.py +23 -0
  25. pyhardlinkbackup-1.0.0/PyHardLinkBackup/cli_dev/testing.py +52 -0
  26. pyhardlinkbackup-1.0.0/PyHardLinkBackup/cli_dev/update_readme_history.py +33 -0
  27. pyhardlinkbackup-1.0.0/PyHardLinkBackup/constants.py +16 -0
  28. pyhardlinkbackup-1.0.0/PyHardLinkBackup/tests/__init__.py +36 -0
  29. pyhardlinkbackup-1.0.0/PyHardLinkBackup/tests/test_backup.py +399 -0
  30. pyhardlinkbackup-1.0.0/PyHardLinkBackup/tests/test_doc_write.py +25 -0
  31. pyhardlinkbackup-1.0.0/PyHardLinkBackup/tests/test_doctests.py +10 -0
  32. pyhardlinkbackup-1.0.0/PyHardLinkBackup/tests/test_project_setup.py +46 -0
  33. pyhardlinkbackup-1.0.0/PyHardLinkBackup/tests/test_readme.py +75 -0
  34. pyhardlinkbackup-1.0.0/PyHardLinkBackup/tests/test_readme_history.py +8 -0
  35. pyhardlinkbackup-1.0.0/PyHardLinkBackup/utilities/__init__.py +0 -0
  36. pyhardlinkbackup-1.0.0/PyHardLinkBackup/utilities/file_hash_database.py +58 -0
  37. pyhardlinkbackup-1.0.0/PyHardLinkBackup/utilities/file_size_database.py +46 -0
  38. pyhardlinkbackup-1.0.0/PyHardLinkBackup/utilities/filesystem.py +133 -0
  39. pyhardlinkbackup-1.0.0/PyHardLinkBackup/utilities/humanize.py +22 -0
  40. pyhardlinkbackup-1.0.0/PyHardLinkBackup/utilities/rich_utils.py +98 -0
  41. pyhardlinkbackup-1.0.0/PyHardLinkBackup/utilities/tests/__init__.py +0 -0
  42. pyhardlinkbackup-1.0.0/PyHardLinkBackup/utilities/tests/test_file_hash_database.py +134 -0
  43. pyhardlinkbackup-1.0.0/PyHardLinkBackup/utilities/tests/test_file_size_database.py +131 -0
  44. pyhardlinkbackup-1.0.0/PyHardLinkBackup/utilities/tests/test_filesystem.py +94 -0
  45. pyhardlinkbackup-1.0.0/README.md +532 -0
  46. pyhardlinkbackup-1.0.0/cli.py +123 -0
  47. pyhardlinkbackup-1.0.0/dev-cli.py +122 -0
  48. pyhardlinkbackup-1.0.0/dist/.gitignore +1 -0
  49. pyhardlinkbackup-1.0.0/docs/README.md +57 -0
  50. pyhardlinkbackup-1.0.0/docs/about-docs.md +8 -0
  51. pyhardlinkbackup-1.0.0/noxfile.py +27 -0
  52. pyhardlinkbackup-1.0.0/pyproject.toml +149 -0
  53. pyhardlinkbackup-1.0.0/uv.lock +1542 -0
@@ -0,0 +1,20 @@
1
+ # see https://editorconfig.org
2
+ root = true
3
+
4
+ [*]
5
+ indent_style = space
6
+ indent_size = 4
7
+ end_of_line = lf
8
+ charset = utf-8
9
+ trim_trailing_whitespace = true
10
+ insert_final_newline = true
11
+
12
+ [*.py]
13
+ max_line_length = 119
14
+
15
+ [{Makefile,**.mk}]
16
+ indent_style = tab
17
+ insert_final_newline = false
18
+
19
+ [{*.yaml,*.yml}]
20
+ indent_size = 2
@@ -0,0 +1,72 @@
1
+
2
+ name: tests
3
+ permissions:
4
+ contents: read
5
+
6
+ on:
7
+ push:
8
+ branches:
9
+ - main
10
+ pull_request:
11
+ schedule:
12
+ - cron: '0 8 * * *'
13
+
14
+ jobs:
15
+ test:
16
+ runs-on: ubuntu-latest
17
+ strategy:
18
+ fail-fast: false
19
+ matrix:
20
+ python-version: ["3.14", "3.13", "3.12"]
21
+ steps:
22
+ - name: Checkout
23
+ run: |
24
+ echo $GITHUB_REF $GITHUB_SHA
25
+ git clone https://github.com/$GITHUB_REPOSITORY.git .
26
+ git fetch origin $GITHUB_SHA:temporary-ci-branch
27
+ git checkout $GITHUB_SHA || (git fetch && git checkout $GITHUB_SHA)
28
+
29
+ - name: 'Set up Python ${{ matrix.python-version }}'
30
+ uses: actions/setup-python@v5
31
+ # https://github.com/marketplace/actions/setup-python
32
+ with:
33
+ python-version: '${{ matrix.python-version }}'
34
+ cache: 'pip' # caching pip dependencies
35
+ cache-dependency-path: '**/requirements.*.txt'
36
+
37
+ - name: 'Bootstrap app venv'
38
+ # The first CLI call will create the .venv
39
+ run: |
40
+ ./cli.py version
41
+
42
+ - name: 'app CLI help'
43
+ run: |
44
+ ./cli.py --help
45
+
46
+ - name: 'Bootstrap dev venv'
47
+ # The first CLI call will create the .venv
48
+ run: |
49
+ ./dev-cli.py version
50
+
51
+ - name: 'dev CLI help'
52
+ run: |
53
+ ./dev-cli.py --help
54
+
55
+ - name: 'Run pip-audit'
56
+ run: |
57
+ ./dev-cli.py pip-audit
58
+
59
+ - name: 'Run tests with Python v${{ matrix.python-version }}'
60
+ env:
61
+ PYTHONUNBUFFERED: 1
62
+ PYTHONWARNINGS: always
63
+ run: |
64
+ ./dev-cli.py coverage
65
+
66
+ - name: 'Upload coverage report'
67
+ uses: codecov/codecov-action@v4
68
+ # https://github.com/marketplace/actions/codecov
69
+ with:
70
+ fail_ci_if_error: false
71
+ verbose: true
72
+
@@ -0,0 +1,15 @@
1
+ .*
2
+ *.egg-info
3
+ __pycache__
4
+ /dist/
5
+ /build/
6
+ /coverage.*
7
+ *.orig
8
+
9
+ !.github
10
+ !.run
11
+ !.editorconfig
12
+ !.gitignore
13
+ !.pre-commit-config.yaml
14
+ !.pre-commit-hooks.yaml
15
+ !.gitkeep
@@ -0,0 +1,3 @@
1
+ # Default ignored files
2
+ /shelf/
3
+ /workspace.xml
@@ -0,0 +1,7 @@
1
+ # pre-commit plugin configuration
2
+ # See https://pre-commit.com for more information
3
+ repos:
4
+ - repo: https://github.com/jedie/cli-base-utilities
5
+ rev: v0.26.0
6
+ hooks:
7
+ - id: update-readme-history
@@ -0,0 +1,13 @@
1
+ # https://pre-commit.com/#creating-new-hooks
2
+ - id: update-readme-history
3
+ name: cli-base-utilities
4
+ description: >-
5
+ Update history in README.md from git log.
6
+ entry: "python -m cli_base update-readme-history -v"
7
+ language: python
8
+ language_version: python3
9
+ require_serial: true
10
+ pass_filenames: false
11
+ always_run: true
12
+ verbose: true
13
+ stages: [pre-commit, post-rewrite, pre-push]
@@ -0,0 +1,24 @@
1
+ <component name="ProjectRunConfigurationManager">
2
+ <configuration default="true" type="tests" factoryName="Unittests">
3
+ <module name="PyHardLinkBackup" />
4
+ <option name="ENV_FILES" value="" />
5
+ <option name="INTERPRETER_OPTIONS" value="" />
6
+ <option name="PARENT_ENVS" value="true" />
7
+ <envs>
8
+ <env name="PYTHONUNBUFFERED" value="1" />
9
+ <env name="PYTHONWARNINGS" value="always" />
10
+ </envs>
11
+ <option name="SDK_HOME" value="$PROJECT_DIR$/.venv/bin/python" />
12
+ <option name="SDK_NAME" value="Python 3 (manageprojects)" />
13
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
14
+ <option name="IS_MODULE_SDK" value="false" />
15
+ <option name="ADD_CONTENT_ROOTS" value="false" />
16
+ <option name="ADD_SOURCE_ROOTS" value="false" />
17
+ <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
18
+ <option name="_new_pattern" value="&quot;&quot;" />
19
+ <option name="_new_additionalArguments" value="&quot;--locals --verbose&quot;" />
20
+ <option name="_new_target" value="&quot;&quot;" />
21
+ <option name="_new_targetType" value="&quot;PATH&quot;" />
22
+ <method v="2" />
23
+ </configuration>
24
+ </component>
@@ -0,0 +1,22 @@
1
+ <component name="ProjectRunConfigurationManager">
2
+ <configuration default="false" name="Unittests - **all**" type="tests" factoryName="Autodetect">
3
+ <module name="PyHardLinkBackup" />
4
+ <option name="ENV_FILES" value="" />
5
+ <option name="INTERPRETER_OPTIONS" value="" />
6
+ <option name="PARENT_ENVS" value="true" />
7
+ <envs>
8
+ <env name="PYTHONUNBUFFERED" value="1" />
9
+ <env name="PYTHONWARNINGS" value="always" />
10
+ </envs>
11
+ <option name="SDK_HOME" value="" />
12
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
13
+ <option name="IS_MODULE_SDK" value="true" />
14
+ <option name="ADD_CONTENT_ROOTS" value="false" />
15
+ <option name="ADD_SOURCE_ROOTS" value="false" />
16
+ <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
17
+ <option name="_new_additionalArguments" value="&quot;--locals --verbose&quot;" />
18
+ <option name="_new_target" value="&quot;test_manageprojects.ManageProjectsTestCase.test_start_project&quot;" />
19
+ <option name="_new_targetType" value="&quot;CUSTOM&quot;" />
20
+ <method v="2" />
21
+ </configuration>
22
+ </component>
@@ -0,0 +1,25 @@
1
+ <component name="ProjectRunConfigurationManager">
2
+ <configuration default="false" name="cli.py --help" type="PythonConfigurationType" factoryName="Python">
3
+ <module name="PyHardLinkBackup" />
4
+ <option name="ENV_FILES" value="" />
5
+ <option name="INTERPRETER_OPTIONS" value="" />
6
+ <option name="PARENT_ENVS" value="true" />
7
+ <envs>
8
+ <env name="PYTHONUNBUFFERED" value="1" />
9
+ </envs>
10
+ <option name="SDK_HOME" value="" />
11
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
12
+ <option name="IS_MODULE_SDK" value="true" />
13
+ <option name="ADD_CONTENT_ROOTS" value="false" />
14
+ <option name="ADD_SOURCE_ROOTS" value="false" />
15
+ <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
16
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/cli.py" />
17
+ <option name="PARAMETERS" value="--help" />
18
+ <option name="SHOW_COMMAND_LINE" value="false" />
19
+ <option name="EMULATE_TERMINAL" value="false" />
20
+ <option name="MODULE_MODE" value="false" />
21
+ <option name="REDIRECT_INPUT" value="false" />
22
+ <option name="INPUT_FILE" value="" />
23
+ <method v="2" />
24
+ </configuration>
25
+ </component>
@@ -0,0 +1,26 @@
1
+ <component name="ProjectRunConfigurationManager">
2
+ <configuration default="false" name="dev-cli update" type="PythonConfigurationType" factoryName="Python">
3
+ <module name="PyHardLinkBackup" />
4
+ <option name="ENV_FILES" value="" />
5
+ <option name="INTERPRETER_OPTIONS" value="" />
6
+ <option name="PARENT_ENVS" value="true" />
7
+ <envs>
8
+ <env name="PYTHONUNBUFFERED" value="1" />
9
+ </envs>
10
+ <option name="SDK_HOME" value="" />
11
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
12
+ <option name="IS_MODULE_SDK" value="true" />
13
+ <option name="ADD_CONTENT_ROOTS" value="false" />
14
+ <option name="ADD_SOURCE_ROOTS" value="false" />
15
+ <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
16
+ <option name="RUN_TOOL" value="" />
17
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/dev-cli.py" />
18
+ <option name="PARAMETERS" value="update" />
19
+ <option name="SHOW_COMMAND_LINE" value="false" />
20
+ <option name="EMULATE_TERMINAL" value="false" />
21
+ <option name="MODULE_MODE" value="false" />
22
+ <option name="REDIRECT_INPUT" value="false" />
23
+ <option name="INPUT_FILE" value="" />
24
+ <method v="2" />
25
+ </configuration>
26
+ </component>
@@ -0,0 +1,23 @@
1
+ <component name="ProjectRunConfigurationManager">
2
+ <configuration default="false" name="only DocTests" type="tests" factoryName="Unittests">
3
+ <module name="PyHardLinkBackup" />
4
+ <option name="ENV_FILES" value="" />
5
+ <option name="INTERPRETER_OPTIONS" value="" />
6
+ <option name="PARENT_ENVS" value="true" />
7
+ <envs>
8
+ <env name="PYTHONUNBUFFERED" value="1" />
9
+ <env name="PYTHONWARNINGS" value="always" />
10
+ </envs>
11
+ <option name="SDK_HOME" value="" />
12
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
13
+ <option name="IS_MODULE_SDK" value="true" />
14
+ <option name="ADD_CONTENT_ROOTS" value="false" />
15
+ <option name="ADD_SOURCE_ROOTS" value="false" />
16
+ <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
17
+ <option name="_new_pattern" value="&quot;&quot;" />
18
+ <option name="_new_additionalArguments" value="&quot;--locals --verbose&quot;" />
19
+ <option name="_new_target" value="&quot;manageprojects.tests.test_doctests.DocTests.test_doctests&quot;" />
20
+ <option name="_new_targetType" value="&quot;PYTHON&quot;" />
21
+ <method v="2" />
22
+ </configuration>
23
+ </component>
@@ -0,0 +1,24 @@
1
+ <component name="ProjectRunConfigurationManager">
2
+ <configuration default="false" name="only DocWrite" type="tests" factoryName="Unittests">
3
+ <module name="PyHardLinkBackup" />
4
+ <option name="ENV_FILES" value="" />
5
+ <option name="INTERPRETER_OPTIONS" value="" />
6
+ <option name="PARENT_ENVS" value="true" />
7
+ <envs>
8
+ <env name="PYTHONUNBUFFERED" value="1" />
9
+ <env name="PYTHONWARNINGS" value="always" />
10
+ </envs>
11
+ <option name="SDK_HOME" value="" />
12
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
13
+ <option name="IS_MODULE_SDK" value="true" />
14
+ <option name="ADD_CONTENT_ROOTS" value="false" />
15
+ <option name="ADD_SOURCE_ROOTS" value="false" />
16
+ <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
17
+ <option name="RUN_TOOL" value="" />
18
+ <option name="_new_pattern" value="&quot;&quot;" />
19
+ <option name="_new_additionalArguments" value="&quot;&quot;" />
20
+ <option name="_new_target" value="&quot;PyHardLinkBackup.tests.test_doc_write&quot;" />
21
+ <option name="_new_targetType" value="&quot;PYTHON&quot;" />
22
+ <method v="2" />
23
+ </configuration>
24
+ </component>