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.
- marsh_lib-0.3.0/.circleci/config.yml +73 -0
- marsh_lib-0.3.0/.github/ISSUE_TEMPLATE/bug-report.md +36 -0
- marsh_lib-0.3.0/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- marsh_lib-0.3.0/.github/ISSUE_TEMPLATE/other.md +14 -0
- marsh_lib-0.3.0/.github/pull_request_template.md +24 -0
- marsh_lib-0.3.0/.github/workflows/release.yml +214 -0
- marsh_lib-0.3.0/.github/workflows/test.yml +47 -0
- marsh_lib-0.3.0/.gitignore +177 -0
- marsh_lib-0.3.0/LICENSE +21 -0
- marsh_lib-0.3.0/PKG-INFO +629 -0
- marsh_lib-0.3.0/README.md +602 -0
- marsh_lib-0.3.0/Taskfile.yml +129 -0
- marsh_lib-0.3.0/docs/P0_REPOSITORY_AUDIT.md +185 -0
- marsh_lib-0.3.0/docs/P6_UX_COMPOSITION_EVALUATION.md +41 -0
- marsh_lib-0.3.0/docs/architecture.md +35 -0
- marsh_lib-0.3.0/pyproject.toml +80 -0
- marsh_lib-0.3.0/run_act.sh +19 -0
- marsh_lib-0.3.0/run_pytest.sh +7 -0
- marsh_lib-0.3.0/run_tests_with_sysbox.sh +9 -0
- marsh_lib-0.3.0/src/marsh/__init__.py +2 -0
- marsh_lib-0.3.0/src/marsh/bash/__init__.py +3 -0
- marsh_lib-0.3.0/src/marsh/bash/bash_factory.py +74 -0
- marsh_lib-0.3.0/src/marsh/bash/bash_grammar.py +44 -0
- marsh_lib-0.3.0/src/marsh/bash/bash_runner_decorators.py +0 -0
- marsh_lib-0.3.0/src/marsh/bash/bash_script.py +71 -0
- marsh_lib-0.3.0/src/marsh/constants.py +5 -0
- marsh_lib-0.3.0/src/marsh/core/__init__.py +24 -0
- marsh_lib-0.3.0/src/marsh/core/authenticator.py +7 -0
- marsh_lib-0.3.0/src/marsh/core/cache.py +91 -0
- marsh_lib-0.3.0/src/marsh/core/cmd_run_decorator.py +289 -0
- marsh_lib-0.3.0/src/marsh/core/cmd_runner_spec.py +98 -0
- marsh_lib-0.3.0/src/marsh/core/command_grammar.py +139 -0
- marsh_lib-0.3.0/src/marsh/core/configuration.py +146 -0
- marsh_lib-0.3.0/src/marsh/core/connector.py +77 -0
- marsh_lib-0.3.0/src/marsh/core/conveyor.py +138 -0
- marsh_lib-0.3.0/src/marsh/core/domain.py +248 -0
- marsh_lib-0.3.0/src/marsh/core/executor.py +394 -0
- marsh_lib-0.3.0/src/marsh/core/expression.py +208 -0
- marsh_lib-0.3.0/src/marsh/core/observability.py +64 -0
- marsh_lib-0.3.0/src/marsh/core/policies.py +89 -0
- marsh_lib-0.3.0/src/marsh/core/providers.py +114 -0
- marsh_lib-0.3.0/src/marsh/core/runtime.py +367 -0
- marsh_lib-0.3.0/src/marsh/core/script.py +38 -0
- marsh_lib-0.3.0/src/marsh/core/serialization.py +85 -0
- marsh_lib-0.3.0/src/marsh/dag/__init__.py +11 -0
- marsh_lib-0.3.0/src/marsh/dag/dag.py +748 -0
- marsh_lib-0.3.0/src/marsh/dag/node.py +79 -0
- marsh_lib-0.3.0/src/marsh/dag/startable.py +48 -0
- marsh_lib-0.3.0/src/marsh/docker/__init__.py +2 -0
- marsh_lib-0.3.0/src/marsh/docker/docker_command_grammar.py +31 -0
- marsh_lib-0.3.0/src/marsh/docker/docker_executor.py +181 -0
- marsh_lib-0.3.0/src/marsh/exceptions.py +16 -0
- marsh_lib-0.3.0/src/marsh/logger.py +118 -0
- marsh_lib-0.3.0/src/marsh/modifier_functions/__init__.py +2 -0
- marsh_lib-0.3.0/src/marsh/modifier_functions/case_conversion.py +17 -0
- marsh_lib-0.3.0/src/marsh/modifier_functions/readers.py +11 -0
- marsh_lib-0.3.0/src/marsh/powershell/__init__.py +0 -0
- marsh_lib-0.3.0/src/marsh/processor_functions/__init__.py +3 -0
- marsh_lib-0.3.0/src/marsh/processor_functions/printers.py +91 -0
- marsh_lib-0.3.0/src/marsh/processor_functions/raisers.py +8 -0
- marsh_lib-0.3.0/src/marsh/processor_functions/redirections.py +73 -0
- marsh_lib-0.3.0/src/marsh/signals.py +1 -0
- marsh_lib-0.3.0/src/marsh/ssh/__init__.py +3 -0
- marsh_lib-0.3.0/src/marsh/ssh/ssh_command_grammar.py +50 -0
- marsh_lib-0.3.0/src/marsh/ssh/ssh_connector.py +71 -0
- marsh_lib-0.3.0/src/marsh/ssh/ssh_factory.py +93 -0
- marsh_lib-0.3.0/src/marsh/utils/__init__.py +20 -0
- marsh_lib-0.3.0/src/marsh/utils/output_streams.py +27 -0
- 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/
|
marsh_lib-0.3.0/LICENSE
ADDED
|
@@ -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.
|