marsh-lib 0.3.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 (69) hide show
  1. marsh_lib-0.3.0/.circleci/config.yml +73 -0
  2. marsh_lib-0.3.0/.github/ISSUE_TEMPLATE/bug-report.md +36 -0
  3. marsh_lib-0.3.0/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  4. marsh_lib-0.3.0/.github/ISSUE_TEMPLATE/other.md +14 -0
  5. marsh_lib-0.3.0/.github/pull_request_template.md +24 -0
  6. marsh_lib-0.3.0/.github/workflows/release.yml +214 -0
  7. marsh_lib-0.3.0/.github/workflows/test.yml +47 -0
  8. marsh_lib-0.3.0/.gitignore +177 -0
  9. marsh_lib-0.3.0/LICENSE +21 -0
  10. marsh_lib-0.3.0/PKG-INFO +629 -0
  11. marsh_lib-0.3.0/README.md +602 -0
  12. marsh_lib-0.3.0/Taskfile.yml +129 -0
  13. marsh_lib-0.3.0/docs/P0_REPOSITORY_AUDIT.md +185 -0
  14. marsh_lib-0.3.0/docs/P6_UX_COMPOSITION_EVALUATION.md +41 -0
  15. marsh_lib-0.3.0/docs/architecture.md +35 -0
  16. marsh_lib-0.3.0/pyproject.toml +80 -0
  17. marsh_lib-0.3.0/run_act.sh +19 -0
  18. marsh_lib-0.3.0/run_pytest.sh +7 -0
  19. marsh_lib-0.3.0/run_tests_with_sysbox.sh +9 -0
  20. marsh_lib-0.3.0/src/marsh/__init__.py +2 -0
  21. marsh_lib-0.3.0/src/marsh/bash/__init__.py +3 -0
  22. marsh_lib-0.3.0/src/marsh/bash/bash_factory.py +74 -0
  23. marsh_lib-0.3.0/src/marsh/bash/bash_grammar.py +44 -0
  24. marsh_lib-0.3.0/src/marsh/bash/bash_runner_decorators.py +0 -0
  25. marsh_lib-0.3.0/src/marsh/bash/bash_script.py +71 -0
  26. marsh_lib-0.3.0/src/marsh/constants.py +5 -0
  27. marsh_lib-0.3.0/src/marsh/core/__init__.py +24 -0
  28. marsh_lib-0.3.0/src/marsh/core/authenticator.py +7 -0
  29. marsh_lib-0.3.0/src/marsh/core/cache.py +91 -0
  30. marsh_lib-0.3.0/src/marsh/core/cmd_run_decorator.py +289 -0
  31. marsh_lib-0.3.0/src/marsh/core/cmd_runner_spec.py +98 -0
  32. marsh_lib-0.3.0/src/marsh/core/command_grammar.py +139 -0
  33. marsh_lib-0.3.0/src/marsh/core/configuration.py +146 -0
  34. marsh_lib-0.3.0/src/marsh/core/connector.py +77 -0
  35. marsh_lib-0.3.0/src/marsh/core/conveyor.py +138 -0
  36. marsh_lib-0.3.0/src/marsh/core/domain.py +248 -0
  37. marsh_lib-0.3.0/src/marsh/core/executor.py +394 -0
  38. marsh_lib-0.3.0/src/marsh/core/expression.py +208 -0
  39. marsh_lib-0.3.0/src/marsh/core/observability.py +64 -0
  40. marsh_lib-0.3.0/src/marsh/core/policies.py +89 -0
  41. marsh_lib-0.3.0/src/marsh/core/providers.py +114 -0
  42. marsh_lib-0.3.0/src/marsh/core/runtime.py +367 -0
  43. marsh_lib-0.3.0/src/marsh/core/script.py +38 -0
  44. marsh_lib-0.3.0/src/marsh/core/serialization.py +85 -0
  45. marsh_lib-0.3.0/src/marsh/dag/__init__.py +11 -0
  46. marsh_lib-0.3.0/src/marsh/dag/dag.py +748 -0
  47. marsh_lib-0.3.0/src/marsh/dag/node.py +79 -0
  48. marsh_lib-0.3.0/src/marsh/dag/startable.py +48 -0
  49. marsh_lib-0.3.0/src/marsh/docker/__init__.py +2 -0
  50. marsh_lib-0.3.0/src/marsh/docker/docker_command_grammar.py +31 -0
  51. marsh_lib-0.3.0/src/marsh/docker/docker_executor.py +181 -0
  52. marsh_lib-0.3.0/src/marsh/exceptions.py +16 -0
  53. marsh_lib-0.3.0/src/marsh/logger.py +118 -0
  54. marsh_lib-0.3.0/src/marsh/modifier_functions/__init__.py +2 -0
  55. marsh_lib-0.3.0/src/marsh/modifier_functions/case_conversion.py +17 -0
  56. marsh_lib-0.3.0/src/marsh/modifier_functions/readers.py +11 -0
  57. marsh_lib-0.3.0/src/marsh/powershell/__init__.py +0 -0
  58. marsh_lib-0.3.0/src/marsh/processor_functions/__init__.py +3 -0
  59. marsh_lib-0.3.0/src/marsh/processor_functions/printers.py +91 -0
  60. marsh_lib-0.3.0/src/marsh/processor_functions/raisers.py +8 -0
  61. marsh_lib-0.3.0/src/marsh/processor_functions/redirections.py +73 -0
  62. marsh_lib-0.3.0/src/marsh/signals.py +1 -0
  63. marsh_lib-0.3.0/src/marsh/ssh/__init__.py +3 -0
  64. marsh_lib-0.3.0/src/marsh/ssh/ssh_command_grammar.py +50 -0
  65. marsh_lib-0.3.0/src/marsh/ssh/ssh_connector.py +71 -0
  66. marsh_lib-0.3.0/src/marsh/ssh/ssh_factory.py +93 -0
  67. marsh_lib-0.3.0/src/marsh/utils/__init__.py +20 -0
  68. marsh_lib-0.3.0/src/marsh/utils/output_streams.py +27 -0
  69. marsh_lib-0.3.0/uv.lock +775 -0
@@ -0,0 +1,73 @@
1
+ version: 2.1
2
+
3
+ jobs:
4
+ test:
5
+ parameters:
6
+ python-version:
7
+ type: string
8
+ docker:
9
+ - image: cimg/python:<< parameters.python-version >>
10
+ resource_class: medium
11
+ steps:
12
+ - checkout
13
+ - run:
14
+ name: Install uv
15
+ command: |
16
+ python -m pip install --upgrade pip
17
+ python -m pip install uv
18
+ - run:
19
+ name: Install dependencies
20
+ command: uv sync --all-groups
21
+ - run:
22
+ name: Run baseline tests
23
+ command: |
24
+ uv run pytest -vv --disable-warnings --tb=short \
25
+ --ignore=tests/ssh/test_ssh_connector.py \
26
+ --ignore=tests/ssh/test_ssh_factory.py \
27
+ --ignore=tests/docker/
28
+
29
+ lint:
30
+ docker:
31
+ - image: cimg/python:3.10
32
+ resource_class: small
33
+ steps:
34
+ - checkout
35
+ - run:
36
+ name: Install uv
37
+ command: |
38
+ python -m pip install --upgrade pip
39
+ python -m pip install uv
40
+ - run:
41
+ name: Install dependencies
42
+ command: uv sync --all-groups
43
+ - run:
44
+ name: Run pflake8
45
+ command: uv run pflake8 src/marsh --select=E9,F --ignore=F401,F403,F405,F541,F811,F841
46
+
47
+ build:
48
+ docker:
49
+ - image: cimg/python:3.10
50
+ resource_class: small
51
+ steps:
52
+ - checkout
53
+ - run:
54
+ name: Install uv
55
+ command: |
56
+ python -m pip install --upgrade pip
57
+ python -m pip install uv
58
+ - run:
59
+ name: Install dependencies
60
+ command: uv sync --all-groups
61
+ - run:
62
+ name: Build wheel
63
+ command: uv build --wheel --out-dir dist -v
64
+
65
+ workflows:
66
+ baseline:
67
+ jobs:
68
+ - test:
69
+ matrix:
70
+ parameters:
71
+ python-version: ["3.10", "3.11", "3.12"]
72
+ - lint
73
+ - build
@@ -0,0 +1,36 @@
1
+ ---
2
+ name: Bug report
3
+ about: Create a bug report to help us address the errors in the codebase
4
+ title: "[BUG] Briefly describe the bug"
5
+ labels: bug
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
+
16
+ ## Expected behavior
17
+ [A clear and concise description of what you expected to happen]
18
+
19
+ ## Actual behavior
20
+ [A clear and concise description of what actually happened]
21
+
22
+ ## Screenshots
23
+ [If applicable, add screenshots to help explain your problem]
24
+
25
+ ## Dependencies
26
+ [If applicable, describe or list the dependencies in your setup or environment]
27
+
28
+ ## OS and Environment
29
+ - OS: [e.g. Windows]
30
+ - Distro: [e.g. Ubuntu for Linux OS]
31
+ - Version: [e.g. 22H2 for Windows]
32
+ - Architecture: [e.g. x86_64/amd64]
33
+ - Kernel Version: [e.g. 5.15.0-86-generic for Linux]
34
+
35
+ ## Additional context
36
+ [Add any other context about the issue here]
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest ideas, new features, or enhancements for this project
4
+ title: "[FEATURE] Feature name"
5
+ labels: feature
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 [...]. Provide examples, if applicable.
12
+
13
+ ## Describe the solution you'd like
14
+ A clear and concise description of what you want to happen. Provide examples, if applicable.
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.
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: Other
3
+ about: Describe issues other than bug or feature. DO NOT create blank issues
4
+ title: Issue Title
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ ## Description
11
+ [Please provide a clear and brief description of the issue or topic]
12
+
13
+ ## Additional information
14
+ [Is there any additional information you'd like to share about this issue?]
@@ -0,0 +1,24 @@
1
+ ## Description
2
+ [Brief and concise description of the changes]
3
+
4
+ ## What kind of changes did you make?
5
+ - [ ] Add new feature or enhancement (core or non-core components)?
6
+ - [ ] Add or update extensions (non-core components)?
7
+ - [ ] Refactor or optimize code?
8
+ - [ ] Fix a bug?
9
+ - [ ] Add or update the documentations?
10
+ - [ ] Add or update the tests?
11
+
12
+ ## Checklist
13
+ - [ ] This PR represents my original work and does not include plagiarized code.
14
+ - [ ] I have read and adhered to the project’s CONTRIBUTING guidelines.
15
+ - [ ] I have followed the project's coding style and guidelines.
16
+ - [ ] Documentation has been updated to reflect changes (e.g., README, inline comments, etc.).
17
+ - [ ] Related API documentation, if any, has been updated.
18
+ - [ ] My code is self-documented with clear comments for complex areas.
19
+ - [ ] Public methods and classes include appropriate docstrings.
20
+ - [ ] Function names, variables, and class names are descriptive and adhere to naming conventions.
21
+ - [ ] I understand that pull requests will not be merged if they do not pass the automated tests.
22
+ - [ ] New functionality is covered by automated tests.
23
+ - [ ] Code changes have been tested across relevant environments or configurations.
24
+ - [ ] I have verified that the changes do not introduce any new vulnerabilities or security risks.
@@ -0,0 +1,214 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v[0-9]+.[0-9]+.[0-9]+'
7
+ - 'v[0-9]+.[0-9]+.[0-9]+rc[0-9]+'
8
+ - 'v[0-9]+.[0-9]+.[0-9]+[ab][0-9]+'
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ build:
15
+ name: Build and validate distributions
16
+ runs-on: ubuntu-latest
17
+ permissions:
18
+ contents: read
19
+ steps:
20
+ - name: Checkout exact release tag
21
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
22
+ with:
23
+ ref: ${{ github.ref }}
24
+ fetch-depth: 1
25
+ persist-credentials: false
26
+
27
+ - name: Verify release tag points to main history
28
+ run: |
29
+ git fetch origin main --no-tags
30
+ git merge-base --is-ancestor "$GITHUB_SHA" "origin/main" || {
31
+ echo "Release tags must point to a commit contained in main."
32
+ exit 1
33
+ }
34
+
35
+ - name: Install uv
36
+ uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
37
+ with:
38
+ version: "0.12.12"
39
+ enable-cache: false
40
+
41
+ - name: Build wheel and source distribution
42
+ run: uv build --no-sources --out-dir dist
43
+
44
+ - name: Validate release version and distribution set
45
+ env:
46
+ RELEASE_VERSION: ${{ github.ref_name }}
47
+ run: |
48
+ python - <<'PY'
49
+ import os
50
+ from pathlib import Path
51
+ import tomllib
52
+
53
+ version = os.environ["RELEASE_VERSION"].removeprefix("v")
54
+ project = tomllib.loads(Path("pyproject.toml").read_text())["project"]["version"]
55
+ if project != version:
56
+ raise SystemExit(
57
+ f"Package version {project!r} does not match tag version {version!r}"
58
+ )
59
+
60
+ files = sorted(p.name for p in Path("dist").iterdir() if p.is_file() and not p.name.startswith("."))
61
+ wheels = [name for name in files if name.endswith(".whl")]
62
+ sdists = [name for name in files if name.endswith(".tar.gz")]
63
+
64
+ if len(wheels) != 1 or len(sdists) != 1 or len(files) != 2:
65
+ raise SystemExit(f"Expected exactly one wheel and one sdist, found: {files}")
66
+
67
+ expected_wheel_prefix = f"marsh_lib-{version}-"
68
+ expected_sdist = f"marsh_lib-{version}.tar.gz"
69
+ if not wheels[0].startswith(expected_wheel_prefix):
70
+ raise SystemExit(f"Unexpected wheel filename: {wheels[0]}")
71
+ if sdists[0] != expected_sdist:
72
+ raise SystemExit(f"Unexpected sdist filename: {sdists[0]}")
73
+
74
+ print("\n".join(files))
75
+ PY
76
+
77
+ - name: Smoke test wheel
78
+ run: uv run --isolated --no-project --with dist/*.whl python -c "import marsh; print(marsh.__file__)"
79
+
80
+ - name: Smoke test source distribution
81
+ run: uv run --isolated --no-project --with dist/*.tar.gz python -c "import marsh; print(marsh.__file__)"
82
+
83
+ - name: Record artifact hashes
84
+ run: sha256sum dist/* | tee dist/SHA256SUMS
85
+
86
+ - name: Upload exact release distributions
87
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
88
+ with:
89
+ name: dist
90
+ path: dist/
91
+ if-no-files-found: error
92
+ retention-days: 14
93
+
94
+ release:
95
+ name: Create GitHub Release
96
+ needs: build
97
+ runs-on: ubuntu-latest
98
+ permissions:
99
+ contents: write
100
+ pull-requests: read
101
+ steps:
102
+ - name: Checkout exact release tag
103
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
104
+ with:
105
+ ref: ${{ github.ref }}
106
+ fetch-depth: 0
107
+ persist-credentials: false
108
+
109
+ - name: Download exact release distributions
110
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
111
+ with:
112
+ name: dist
113
+ path: dist
114
+
115
+ - name: Build changelog
116
+ id: build_changelog
117
+ uses: mikepenz/release-changelog-builder-action@c9dc8369bccbc41e0ac887f8fd674f5925d315f7 # v5
118
+ with:
119
+ configuration: |
120
+ {
121
+ "categories": [
122
+ {"title": "## 🚀 Features", "labels": ["feature", "extension", "core", "enhancement"]},
123
+ {"title": "## 🐛 Bug Fixes", "labels": ["bug", "bugfix", "fix"]},
124
+ {"title": "## 🧪 Tests", "labels": ["test"]},
125
+ {"title": "## 🛠️ Maintenance", "labels": ["documentation", "cicd"]},
126
+ {"title": "## 🚫 Deprecated", "labels": ["deprecate"]}
127
+ ],
128
+ "ignore_labels": ["wip", "do-not-merge"],
129
+ "sort": {"order": "ASC", "on_property": "mergedAt"},
130
+ "template": "# Release Notes for #{{TO_TAG}}\n\n#{{CHANGELOG}}\n\n<details>\n<summary>Uncategorized</summary>\n\n#{{UNCATEGORIZED}}\n</details>",
131
+ "pr_template": "- #{{TITLE}} ([#{{NUMBER}}](#{{URL}})) by @#{{AUTHOR}}"
132
+ }
133
+ fetchReleaseInformation: true
134
+ token: ${{ secrets.GITHUB_TOKEN }}
135
+
136
+ - name: Create GitHub Release with exact artifacts
137
+ uses: ncipollo/release-action@339a81892b84b4eeb0f6e744e4574d79d0d9b8dd # v1.21.0
138
+ with:
139
+ token: ${{ secrets.GITHUB_TOKEN }}
140
+ tag: ${{ github.ref_name }}
141
+ name: ${{ github.ref_name }}
142
+ body: ${{ steps.build_changelog.outputs.changelog }}
143
+ artifacts: "dist/*.whl,dist/*.tar.gz"
144
+ allowUpdates: false
145
+ draft: false
146
+
147
+ publish:
148
+ name: Publish exact artifacts to PyPI
149
+ needs: release
150
+ runs-on: ubuntu-latest
151
+ environment:
152
+ name: pypi
153
+ permissions:
154
+ id-token: write
155
+ steps:
156
+ - name: Install uv
157
+ uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
158
+ with:
159
+ version: "0.12.12"
160
+ enable-cache: false
161
+
162
+ - name: Download exact release distributions
163
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
164
+ with:
165
+ name: dist
166
+ path: dist
167
+
168
+ - name: Generate PEP 740 attestations
169
+ uses: astral-sh/attest-action@f589a42a7efb6fe400b4f400de60b4bc90390027 # v0.0.6
170
+ with:
171
+ paths: |
172
+ dist/*.whl
173
+ dist/*.tar.gz
174
+
175
+ - name: Publish exact artifacts to PyPI
176
+ run: uv publish
177
+
178
+ - name: Verify published artifact hashes
179
+ env:
180
+ RELEASE_VERSION: ${{ github.ref_name }}
181
+ run: |
182
+ python - <<'PY'
183
+ import hashlib
184
+ import json
185
+ import os
186
+ from pathlib import Path
187
+ import urllib.request
188
+
189
+ version = os.environ["RELEASE_VERSION"].removeprefix("v")
190
+ url = f"https://pypi.org/pypi/marsh-lib/{version}/json"
191
+ with urllib.request.urlopen(url, timeout=30) as response:
192
+ payload = json.load(response)
193
+
194
+ expected = {
195
+ path.name: hashlib.sha256(path.read_bytes()).hexdigest()
196
+ for path in Path("dist").glob("*")
197
+ if path.is_file() and not path.name.endswith(".attestation")
198
+ }
199
+ published = {
200
+ item["filename"]: item["digests"]["sha256"]
201
+ for item in payload["urls"]
202
+ }
203
+
204
+ missing = sorted(set(expected) - set(published))
205
+ mismatched = sorted(
206
+ name for name, digest in expected.items()
207
+ if published.get(name) != digest
208
+ )
209
+ if missing or mismatched:
210
+ raise SystemExit(
211
+ f"PyPI verification failed; missing={missing}, mismatched={mismatched}"
212
+ )
213
+ print(f"Verified {len(expected)} published artifact hashes for marsh-lib {version}")
214
+ PY
@@ -0,0 +1,47 @@
1
+ name: Python Test
2
+
3
+ on:
4
+ push:
5
+ branches: ["*"]
6
+ pull_request:
7
+ branches: ["main"]
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: read
12
+ pull-requests: write
13
+
14
+ jobs:
15
+ lint_and_test:
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - name: Checkout code
19
+ uses: actions/checkout@v2
20
+
21
+ - name: Install uv
22
+ uses: astral-sh/setup-uv@v10.2.0
23
+ with:
24
+ python-version: '3.10'
25
+
26
+ - name: Install dependencies
27
+ run: |
28
+ uv sync --all-groups
29
+
30
+ # TODO: Setup Docker for testing docker components (and possible ssh components).
31
+ - name: Run pytest
32
+ run: |
33
+ cd src
34
+ uv run --with coverage --with pytest-cov pytest \
35
+ -vv --disable-warnings \
36
+ --tb=short --cov-report xml:../coverage.xml --cov=marsh \
37
+ --ignore=../tests/ssh/test_ssh_connector.py \
38
+ --ignore=../tests/ssh/test_ssh_factory.py \
39
+ --ignore=../tests/docker/ \
40
+ ../tests/
41
+
42
+ - name: Get Coverage
43
+ if: ${{ github.event_name == 'pull_request' }}
44
+ uses: orgoro/coverage@v3.2
45
+ with:
46
+ coverageFile: coverage.xml
47
+ token: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,177 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ #uv.lock
102
+
103
+ # pdm
104
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
105
+ #pdm.lock
106
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
107
+ # in version control.
108
+ # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
109
+ .pdm.toml
110
+ .pdm-python
111
+ .pdm-build/
112
+
113
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
114
+ __pypackages__/
115
+
116
+ # Celery stuff
117
+ celerybeat-schedule
118
+ celerybeat.pid
119
+
120
+ # SageMath parsed files
121
+ *.sage.py
122
+
123
+ # Environments
124
+ .env
125
+ .env.*
126
+ .venv
127
+ env/
128
+ venv/
129
+ ENV/
130
+ env.bak/
131
+ venv.bak/
132
+ !.env.sample
133
+ !.env.*.sample
134
+
135
+ # Spyder project settings
136
+ .spyderproject
137
+ .spyproject
138
+
139
+ # Rope project settings
140
+ .ropeproject
141
+
142
+ # mkdocs documentation
143
+ /site
144
+
145
+ # mypy
146
+ .mypy_cache/
147
+ .dmypy.json
148
+ dmypy.json
149
+
150
+ # Pyre type checker
151
+ .pyre/
152
+
153
+ # pytype static type analyzer
154
+ .pytype/
155
+
156
+ # Cython debug symbols
157
+ cython_debug/
158
+
159
+ # PyCharm
160
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
161
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
162
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
163
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
164
+ .idea/
165
+
166
+ # VS Code
167
+ .vscode
168
+ .vs
169
+
170
+ # Nektos Act
171
+ .secrets
172
+ *.secrets
173
+ .vars
174
+ *.vars
175
+
176
+ # Task
177
+ .task/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Cedric Anover
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.