deltaglider 0.3.0.dev0__tar.gz → 4.0.1.dev0__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.
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/.github/workflows/ci.yml +0 -26
- deltaglider-4.0.1.dev0/.github/workflows/release-manual.yml +249 -0
- deltaglider-4.0.1.dev0/.github/workflows/release.yml +253 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/.gitignore +1 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/PKG-INFO +112 -44
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/README.md +110 -41
- deltaglider-4.0.1.dev0/command.sh +8 -0
- deltaglider-4.0.1.dev0/commit_message.txt +44 -0
- deltaglider-4.0.1.dev0/docs/sdk/README.md +285 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/sdk/api.md +141 -1
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/sdk/examples.md +199 -8
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/pyproject.toml +1 -3
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/__init__.py +18 -2
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/_version.py +3 -3
- deltaglider-4.0.1.dev0/src/deltaglider/adapters/metrics_cloudwatch.py +215 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/storage_s3.py +73 -2
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/app/cli/main.py +56 -20
- deltaglider-4.0.1.dev0/src/deltaglider/client.py +1315 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/core/service.py +287 -1
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider.egg-info/PKG-INFO +112 -44
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider.egg-info/SOURCES.txt +8 -1
- deltaglider-4.0.1.dev0/tests/integration/test_client.py +377 -0
- deltaglider-4.0.1.dev0/tests/integration/test_recursive_delete_reference_cleanup.py +396 -0
- deltaglider-0.3.0.dev0/docs/sdk/README.md +0 -122
- deltaglider-0.3.0.dev0/src/deltaglider/client.py +0 -237
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/.dockerignore +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/CLAUDE.md +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/CONTRIBUTING.md +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/Dockerfile +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/LICENSE +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/MANIFEST.in +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/Makefile +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/PYPI_RELEASE.md +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docker-compose.test.yml +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docker-compose.yml +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/aws-s3-cli-compatibility.md +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/case-study-readonlyrest.md +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/deltaglider.png +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/deltaglider_architecture_guidelines.txt +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/deltaglider_metadata_schema.txt +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/deltaglider_specs.txt +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/sdk/Makefile +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/sdk/architecture.md +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/sdk/generate_docs.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/sdk/getting-started.md +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/run-e2e-tests.sh +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/setup.cfg +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/__init__.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/cache_fs.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/clock_utc.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/diff_xdelta.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/hash_sha.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/logger_std.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/metrics_noop.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/app/__init__.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/app/cli/__init__.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/app/cli/aws_compat.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/app/cli/sync.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/core/__init__.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/core/errors.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/core/models.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/__init__.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/cache.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/clock.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/diff.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/hash.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/logger.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/metrics.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/storage.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/py.typed +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider.egg-info/dependency_links.txt +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider.egg-info/entry_points.txt +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider.egg-info/requires.txt +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider.egg-info/top_level.txt +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/__init__.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/conftest.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/e2e/__init__.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/e2e/test_localstack.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/integration/__init__.py +0 -0
- /deltaglider-0.3.0.dev0/tests/integration/test_aws_cli_commands_v2.py → /deltaglider-4.0.1.dev0/tests/integration/test_aws_cli_commands.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/integration/test_full_workflow.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/integration/test_get_command.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/integration/test_xdelta.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/unit/__init__.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/unit/test_adapters.py +0 -0
- {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/unit/test_core_service.py +0 -0
|
@@ -3,7 +3,6 @@ name: CI
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
5
|
branches: [main, develop]
|
|
6
|
-
tags: ["v*"]
|
|
7
6
|
pull_request:
|
|
8
7
|
branches: [main]
|
|
9
8
|
|
|
@@ -143,28 +142,3 @@ jobs:
|
|
|
143
142
|
run: |
|
|
144
143
|
uv run pytest tests/e2e -v --tb=short
|
|
145
144
|
|
|
146
|
-
pypi-publish:
|
|
147
|
-
needs: [lint, typecheck, test, e2e-test]
|
|
148
|
-
runs-on: ubuntu-latest
|
|
149
|
-
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
|
150
|
-
steps:
|
|
151
|
-
- uses: actions/checkout@v4
|
|
152
|
-
|
|
153
|
-
- name: Install UV
|
|
154
|
-
run: |
|
|
155
|
-
curl -LsSf https://astral.sh/uv/${{ env.UV_VERSION }}/install.sh | sh
|
|
156
|
-
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
|
157
|
-
|
|
158
|
-
- name: Set up Python
|
|
159
|
-
uses: actions/setup-python@v5
|
|
160
|
-
with:
|
|
161
|
-
python-version: ${{ env.PYTHON_VERSION }}
|
|
162
|
-
|
|
163
|
-
- name: Build package
|
|
164
|
-
run: |
|
|
165
|
-
uv build
|
|
166
|
-
|
|
167
|
-
- name: Publish to PyPI
|
|
168
|
-
uses: pypa/gh-action-pypi-publish@release/v1
|
|
169
|
-
with:
|
|
170
|
-
password: ${{ secrets.PYPI_API_TOKEN }}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
name: Manual Release (Simple)
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
version:
|
|
7
|
+
description: 'Version to release (e.g., 0.3.2) - make sure tag v0.3.2 exists!'
|
|
8
|
+
required: true
|
|
9
|
+
type: string
|
|
10
|
+
pypi_environment:
|
|
11
|
+
description: 'PyPI environment'
|
|
12
|
+
required: true
|
|
13
|
+
type: choice
|
|
14
|
+
options:
|
|
15
|
+
- 'pypi'
|
|
16
|
+
- 'testpypi'
|
|
17
|
+
default: 'pypi'
|
|
18
|
+
|
|
19
|
+
env:
|
|
20
|
+
UV_VERSION: "0.5.13"
|
|
21
|
+
PYTHON_VERSION: "3.12"
|
|
22
|
+
|
|
23
|
+
jobs:
|
|
24
|
+
validate:
|
|
25
|
+
runs-on: ubuntu-latest
|
|
26
|
+
outputs:
|
|
27
|
+
tag_name: ${{ steps.validate_tag.outputs.tag }}
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@v4
|
|
30
|
+
with:
|
|
31
|
+
fetch-depth: 0
|
|
32
|
+
|
|
33
|
+
- name: Validate version format
|
|
34
|
+
run: |
|
|
35
|
+
if ! echo "${{ github.event.inputs.version }}" | grep -E '^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?$'; then
|
|
36
|
+
echo "Error: Version must be in format X.Y.Z or X.Y.Z-suffix"
|
|
37
|
+
exit 1
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
- name: Check if tag exists
|
|
41
|
+
id: validate_tag
|
|
42
|
+
run: |
|
|
43
|
+
TAG="v${{ github.event.inputs.version }}"
|
|
44
|
+
if ! git rev-parse "$TAG" >/dev/null 2>&1; then
|
|
45
|
+
echo "Error: Tag $TAG does not exist!"
|
|
46
|
+
echo "Please create it first with:"
|
|
47
|
+
echo " git tag $TAG"
|
|
48
|
+
echo " git push origin $TAG"
|
|
49
|
+
exit 1
|
|
50
|
+
fi
|
|
51
|
+
echo "tag=$TAG" >> $GITHUB_OUTPUT
|
|
52
|
+
|
|
53
|
+
lint:
|
|
54
|
+
needs: validate
|
|
55
|
+
runs-on: ubuntu-latest
|
|
56
|
+
steps:
|
|
57
|
+
- uses: actions/checkout@v4
|
|
58
|
+
with:
|
|
59
|
+
ref: ${{ needs.validate.outputs.tag_name }}
|
|
60
|
+
|
|
61
|
+
- name: Install UV
|
|
62
|
+
run: |
|
|
63
|
+
curl -LsSf https://astral.sh/uv/${{ env.UV_VERSION }}/install.sh | sh
|
|
64
|
+
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
|
65
|
+
|
|
66
|
+
- name: Set up Python
|
|
67
|
+
uses: actions/setup-python@v5
|
|
68
|
+
with:
|
|
69
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
70
|
+
|
|
71
|
+
- name: Install dependencies
|
|
72
|
+
run: |
|
|
73
|
+
uv pip install --system -e ".[dev]"
|
|
74
|
+
|
|
75
|
+
- name: Run ruff check
|
|
76
|
+
run: |
|
|
77
|
+
uv run ruff check src tests
|
|
78
|
+
|
|
79
|
+
- name: Run ruff format check
|
|
80
|
+
run: |
|
|
81
|
+
uv run ruff format --check src tests
|
|
82
|
+
|
|
83
|
+
typecheck:
|
|
84
|
+
needs: validate
|
|
85
|
+
runs-on: ubuntu-latest
|
|
86
|
+
steps:
|
|
87
|
+
- uses: actions/checkout@v4
|
|
88
|
+
with:
|
|
89
|
+
ref: ${{ needs.validate.outputs.tag_name }}
|
|
90
|
+
|
|
91
|
+
- name: Install UV
|
|
92
|
+
run: |
|
|
93
|
+
curl -LsSf https://astral.sh/uv/${{ env.UV_VERSION }}/install.sh | sh
|
|
94
|
+
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
|
95
|
+
|
|
96
|
+
- name: Set up Python
|
|
97
|
+
uses: actions/setup-python@v5
|
|
98
|
+
with:
|
|
99
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
100
|
+
|
|
101
|
+
- name: Install dependencies
|
|
102
|
+
run: |
|
|
103
|
+
uv pip install --system -e ".[dev]"
|
|
104
|
+
|
|
105
|
+
- name: Run mypy
|
|
106
|
+
run: |
|
|
107
|
+
uv run mypy src
|
|
108
|
+
|
|
109
|
+
test:
|
|
110
|
+
needs: validate
|
|
111
|
+
runs-on: ubuntu-latest
|
|
112
|
+
steps:
|
|
113
|
+
- uses: actions/checkout@v4
|
|
114
|
+
with:
|
|
115
|
+
ref: ${{ needs.validate.outputs.tag_name }}
|
|
116
|
+
|
|
117
|
+
- name: Install UV
|
|
118
|
+
run: |
|
|
119
|
+
curl -LsSf https://astral.sh/uv/${{ env.UV_VERSION }}/install.sh | sh
|
|
120
|
+
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
|
121
|
+
|
|
122
|
+
- name: Set up Python
|
|
123
|
+
uses: actions/setup-python@v5
|
|
124
|
+
with:
|
|
125
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
126
|
+
|
|
127
|
+
- name: Install xdelta3
|
|
128
|
+
run: |
|
|
129
|
+
sudo apt-get update
|
|
130
|
+
sudo apt-get install -y xdelta3
|
|
131
|
+
|
|
132
|
+
- name: Install dependencies
|
|
133
|
+
run: |
|
|
134
|
+
uv pip install --system -e ".[dev]"
|
|
135
|
+
|
|
136
|
+
- name: Run unit tests
|
|
137
|
+
run: |
|
|
138
|
+
uv run pytest tests/unit -v --tb=short
|
|
139
|
+
|
|
140
|
+
- name: Run integration tests
|
|
141
|
+
run: |
|
|
142
|
+
uv run pytest tests/integration -v --tb=short
|
|
143
|
+
|
|
144
|
+
e2e-test:
|
|
145
|
+
needs: validate
|
|
146
|
+
runs-on: ubuntu-latest
|
|
147
|
+
services:
|
|
148
|
+
localstack:
|
|
149
|
+
image: localstack/localstack:latest
|
|
150
|
+
ports:
|
|
151
|
+
- 4566:4566
|
|
152
|
+
env:
|
|
153
|
+
SERVICES: s3
|
|
154
|
+
DEBUG: 0
|
|
155
|
+
DATA_DIR: /tmp/localstack/data
|
|
156
|
+
options: >-
|
|
157
|
+
--health-cmd "curl -f http://localhost:4566/_localstack/health"
|
|
158
|
+
--health-interval 10s
|
|
159
|
+
--health-timeout 5s
|
|
160
|
+
--health-retries 5
|
|
161
|
+
|
|
162
|
+
steps:
|
|
163
|
+
- uses: actions/checkout@v4
|
|
164
|
+
with:
|
|
165
|
+
ref: ${{ needs.validate.outputs.tag_name }}
|
|
166
|
+
|
|
167
|
+
- name: Install UV
|
|
168
|
+
run: |
|
|
169
|
+
curl -LsSf https://astral.sh/uv/${{ env.UV_VERSION }}/install.sh | sh
|
|
170
|
+
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
|
171
|
+
|
|
172
|
+
- name: Set up Python
|
|
173
|
+
uses: actions/setup-python@v5
|
|
174
|
+
with:
|
|
175
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
176
|
+
|
|
177
|
+
- name: Install xdelta3
|
|
178
|
+
run: |
|
|
179
|
+
sudo apt-get update
|
|
180
|
+
sudo apt-get install -y xdelta3
|
|
181
|
+
|
|
182
|
+
- name: Install dependencies
|
|
183
|
+
run: |
|
|
184
|
+
uv pip install --system -e ".[dev]"
|
|
185
|
+
|
|
186
|
+
- name: Run E2E tests
|
|
187
|
+
env:
|
|
188
|
+
AWS_ACCESS_KEY_ID: test
|
|
189
|
+
AWS_SECRET_ACCESS_KEY: test
|
|
190
|
+
AWS_DEFAULT_REGION: us-east-1
|
|
191
|
+
AWS_ENDPOINT_URL: http://localhost:4566
|
|
192
|
+
run: |
|
|
193
|
+
uv run pytest tests/e2e -v --tb=short
|
|
194
|
+
|
|
195
|
+
publish:
|
|
196
|
+
needs: [validate, lint, typecheck, test, e2e-test]
|
|
197
|
+
runs-on: ubuntu-latest
|
|
198
|
+
environment: ${{ github.event.inputs.pypi_environment }}
|
|
199
|
+
steps:
|
|
200
|
+
- uses: actions/checkout@v4
|
|
201
|
+
with:
|
|
202
|
+
ref: ${{ needs.validate.outputs.tag_name }}
|
|
203
|
+
fetch-depth: 0 # Important for setuptools-scm
|
|
204
|
+
|
|
205
|
+
- name: Install UV
|
|
206
|
+
run: |
|
|
207
|
+
curl -LsSf https://astral.sh/uv/${{ env.UV_VERSION }}/install.sh | sh
|
|
208
|
+
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
|
209
|
+
|
|
210
|
+
- name: Set up Python
|
|
211
|
+
uses: actions/setup-python@v5
|
|
212
|
+
with:
|
|
213
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
214
|
+
|
|
215
|
+
- name: Build package
|
|
216
|
+
run: |
|
|
217
|
+
uv build
|
|
218
|
+
|
|
219
|
+
- name: Publish to TestPyPI
|
|
220
|
+
if: github.event.inputs.pypi_environment == 'testpypi'
|
|
221
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
222
|
+
with:
|
|
223
|
+
repository-url: https://test.pypi.org/legacy/
|
|
224
|
+
password: ${{ secrets.TEST_PYPI_API_TOKEN }}
|
|
225
|
+
|
|
226
|
+
- name: Publish to PyPI
|
|
227
|
+
if: github.event.inputs.pypi_environment == 'pypi'
|
|
228
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
229
|
+
with:
|
|
230
|
+
password: ${{ secrets.PYPI_API_TOKEN }}
|
|
231
|
+
|
|
232
|
+
- name: Create GitHub Release
|
|
233
|
+
uses: softprops/action-gh-release@v1
|
|
234
|
+
with:
|
|
235
|
+
tag_name: ${{ needs.validate.outputs.tag_name }}
|
|
236
|
+
name: Release v${{ github.event.inputs.version }}
|
|
237
|
+
body: |
|
|
238
|
+
## DeltaGlider v${{ github.event.inputs.version }}
|
|
239
|
+
|
|
240
|
+
Published to ${{ github.event.inputs.pypi_environment == 'pypi' && 'PyPI' || 'TestPyPI' }}
|
|
241
|
+
|
|
242
|
+
### Installation
|
|
243
|
+
```bash
|
|
244
|
+
pip install deltaglider==${{ github.event.inputs.version }}
|
|
245
|
+
```
|
|
246
|
+
draft: false
|
|
247
|
+
prerelease: ${{ contains(github.event.inputs.version, '-') }}
|
|
248
|
+
env:
|
|
249
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
name: Manual Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
version:
|
|
7
|
+
description: 'Version to release (e.g., 0.3.2)'
|
|
8
|
+
required: true
|
|
9
|
+
type: string
|
|
10
|
+
pypi_environment:
|
|
11
|
+
description: 'PyPI environment'
|
|
12
|
+
required: true
|
|
13
|
+
type: choice
|
|
14
|
+
options:
|
|
15
|
+
- 'pypi'
|
|
16
|
+
- 'testpypi'
|
|
17
|
+
default: 'pypi'
|
|
18
|
+
|
|
19
|
+
env:
|
|
20
|
+
UV_VERSION: "0.5.13"
|
|
21
|
+
PYTHON_VERSION: "3.12"
|
|
22
|
+
|
|
23
|
+
jobs:
|
|
24
|
+
validate-and-tag:
|
|
25
|
+
runs-on: ubuntu-latest
|
|
26
|
+
outputs:
|
|
27
|
+
tag_name: ${{ steps.create_tag.outputs.tag }}
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@v4
|
|
30
|
+
with:
|
|
31
|
+
fetch-depth: 0
|
|
32
|
+
token: ${{ secrets.PAT_TOKEN }}
|
|
33
|
+
|
|
34
|
+
- name: Validate version format
|
|
35
|
+
run: |
|
|
36
|
+
if ! echo "${{ github.event.inputs.version }}" | grep -E '^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?$'; then
|
|
37
|
+
echo "Error: Version must be in format X.Y.Z or X.Y.Z-suffix"
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
- name: Check if tag already exists
|
|
42
|
+
run: |
|
|
43
|
+
if git rev-parse "v${{ github.event.inputs.version }}" >/dev/null 2>&1; then
|
|
44
|
+
echo "Error: Tag v${{ github.event.inputs.version }} already exists"
|
|
45
|
+
exit 1
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
- name: Create and push tag
|
|
49
|
+
id: create_tag
|
|
50
|
+
run: |
|
|
51
|
+
git config --global user.name "github-actions[bot]"
|
|
52
|
+
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
|
53
|
+
git tag -a "v${{ github.event.inputs.version }}" -m "Release v${{ github.event.inputs.version }}"
|
|
54
|
+
git push origin "v${{ github.event.inputs.version }}"
|
|
55
|
+
echo "tag=v${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
|
|
56
|
+
|
|
57
|
+
lint:
|
|
58
|
+
needs: validate-and-tag
|
|
59
|
+
runs-on: ubuntu-latest
|
|
60
|
+
steps:
|
|
61
|
+
- uses: actions/checkout@v4
|
|
62
|
+
with:
|
|
63
|
+
ref: ${{ needs.validate-and-tag.outputs.tag_name }}
|
|
64
|
+
|
|
65
|
+
- name: Install UV
|
|
66
|
+
run: |
|
|
67
|
+
curl -LsSf https://astral.sh/uv/${{ env.UV_VERSION }}/install.sh | sh
|
|
68
|
+
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
|
69
|
+
|
|
70
|
+
- name: Set up Python
|
|
71
|
+
uses: actions/setup-python@v5
|
|
72
|
+
with:
|
|
73
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
74
|
+
|
|
75
|
+
- name: Install dependencies
|
|
76
|
+
run: |
|
|
77
|
+
uv pip install --system -e ".[dev]"
|
|
78
|
+
|
|
79
|
+
- name: Run ruff check
|
|
80
|
+
run: |
|
|
81
|
+
uv run ruff check src tests
|
|
82
|
+
|
|
83
|
+
- name: Run ruff format check
|
|
84
|
+
run: |
|
|
85
|
+
uv run ruff format --check src tests
|
|
86
|
+
|
|
87
|
+
typecheck:
|
|
88
|
+
needs: validate-and-tag
|
|
89
|
+
runs-on: ubuntu-latest
|
|
90
|
+
steps:
|
|
91
|
+
- uses: actions/checkout@v4
|
|
92
|
+
with:
|
|
93
|
+
ref: ${{ needs.validate-and-tag.outputs.tag_name }}
|
|
94
|
+
|
|
95
|
+
- name: Install UV
|
|
96
|
+
run: |
|
|
97
|
+
curl -LsSf https://astral.sh/uv/${{ env.UV_VERSION }}/install.sh | sh
|
|
98
|
+
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
|
99
|
+
|
|
100
|
+
- name: Set up Python
|
|
101
|
+
uses: actions/setup-python@v5
|
|
102
|
+
with:
|
|
103
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
104
|
+
|
|
105
|
+
- name: Install dependencies
|
|
106
|
+
run: |
|
|
107
|
+
uv pip install --system -e ".[dev]"
|
|
108
|
+
|
|
109
|
+
- name: Run mypy
|
|
110
|
+
run: |
|
|
111
|
+
uv run mypy src
|
|
112
|
+
|
|
113
|
+
test:
|
|
114
|
+
needs: validate-and-tag
|
|
115
|
+
runs-on: ubuntu-latest
|
|
116
|
+
steps:
|
|
117
|
+
- uses: actions/checkout@v4
|
|
118
|
+
with:
|
|
119
|
+
ref: ${{ needs.validate-and-tag.outputs.tag_name }}
|
|
120
|
+
|
|
121
|
+
- name: Install UV
|
|
122
|
+
run: |
|
|
123
|
+
curl -LsSf https://astral.sh/uv/${{ env.UV_VERSION }}/install.sh | sh
|
|
124
|
+
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
|
125
|
+
|
|
126
|
+
- name: Set up Python
|
|
127
|
+
uses: actions/setup-python@v5
|
|
128
|
+
with:
|
|
129
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
130
|
+
|
|
131
|
+
- name: Install xdelta3
|
|
132
|
+
run: |
|
|
133
|
+
sudo apt-get update
|
|
134
|
+
sudo apt-get install -y xdelta3
|
|
135
|
+
|
|
136
|
+
- name: Install dependencies
|
|
137
|
+
run: |
|
|
138
|
+
uv pip install --system -e ".[dev]"
|
|
139
|
+
|
|
140
|
+
- name: Run unit tests
|
|
141
|
+
run: |
|
|
142
|
+
uv run pytest tests/unit -v --tb=short
|
|
143
|
+
|
|
144
|
+
- name: Run integration tests
|
|
145
|
+
run: |
|
|
146
|
+
uv run pytest tests/integration -v --tb=short
|
|
147
|
+
|
|
148
|
+
e2e-test:
|
|
149
|
+
needs: validate-and-tag
|
|
150
|
+
runs-on: ubuntu-latest
|
|
151
|
+
services:
|
|
152
|
+
localstack:
|
|
153
|
+
image: localstack/localstack:latest
|
|
154
|
+
ports:
|
|
155
|
+
- 4566:4566
|
|
156
|
+
env:
|
|
157
|
+
SERVICES: s3
|
|
158
|
+
DEBUG: 0
|
|
159
|
+
DATA_DIR: /tmp/localstack/data
|
|
160
|
+
options: >-
|
|
161
|
+
--health-cmd "curl -f http://localhost:4566/_localstack/health"
|
|
162
|
+
--health-interval 10s
|
|
163
|
+
--health-timeout 5s
|
|
164
|
+
--health-retries 5
|
|
165
|
+
|
|
166
|
+
steps:
|
|
167
|
+
- uses: actions/checkout@v4
|
|
168
|
+
with:
|
|
169
|
+
ref: ${{ needs.validate-and-tag.outputs.tag_name }}
|
|
170
|
+
|
|
171
|
+
- name: Install UV
|
|
172
|
+
run: |
|
|
173
|
+
curl -LsSf https://astral.sh/uv/${{ env.UV_VERSION }}/install.sh | sh
|
|
174
|
+
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
|
175
|
+
|
|
176
|
+
- name: Set up Python
|
|
177
|
+
uses: actions/setup-python@v5
|
|
178
|
+
with:
|
|
179
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
180
|
+
|
|
181
|
+
- name: Install xdelta3
|
|
182
|
+
run: |
|
|
183
|
+
sudo apt-get update
|
|
184
|
+
sudo apt-get install -y xdelta3
|
|
185
|
+
|
|
186
|
+
- name: Install dependencies
|
|
187
|
+
run: |
|
|
188
|
+
uv pip install --system -e ".[dev]"
|
|
189
|
+
|
|
190
|
+
- name: Run E2E tests
|
|
191
|
+
env:
|
|
192
|
+
AWS_ACCESS_KEY_ID: test
|
|
193
|
+
AWS_SECRET_ACCESS_KEY: test
|
|
194
|
+
AWS_DEFAULT_REGION: us-east-1
|
|
195
|
+
AWS_ENDPOINT_URL: http://localhost:4566
|
|
196
|
+
run: |
|
|
197
|
+
uv run pytest tests/e2e -v --tb=short
|
|
198
|
+
|
|
199
|
+
publish:
|
|
200
|
+
needs: [validate-and-tag, lint, typecheck, test, e2e-test]
|
|
201
|
+
runs-on: ubuntu-latest
|
|
202
|
+
environment: ${{ github.event.inputs.pypi_environment }}
|
|
203
|
+
steps:
|
|
204
|
+
- uses: actions/checkout@v4
|
|
205
|
+
with:
|
|
206
|
+
ref: ${{ needs.validate-and-tag.outputs.tag_name }}
|
|
207
|
+
fetch-depth: 0 # Important for setuptools-scm
|
|
208
|
+
|
|
209
|
+
- name: Install UV
|
|
210
|
+
run: |
|
|
211
|
+
curl -LsSf https://astral.sh/uv/${{ env.UV_VERSION }}/install.sh | sh
|
|
212
|
+
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
|
213
|
+
|
|
214
|
+
- name: Set up Python
|
|
215
|
+
uses: actions/setup-python@v5
|
|
216
|
+
with:
|
|
217
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
218
|
+
|
|
219
|
+
- name: Build package
|
|
220
|
+
run: |
|
|
221
|
+
uv build
|
|
222
|
+
|
|
223
|
+
- name: Publish to TestPyPI
|
|
224
|
+
if: github.event.inputs.pypi_environment == 'testpypi'
|
|
225
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
226
|
+
with:
|
|
227
|
+
repository-url: https://test.pypi.org/legacy/
|
|
228
|
+
password: ${{ secrets.TEST_PYPI_API_TOKEN }}
|
|
229
|
+
|
|
230
|
+
- name: Publish to PyPI
|
|
231
|
+
if: github.event.inputs.pypi_environment == 'pypi'
|
|
232
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
233
|
+
with:
|
|
234
|
+
password: ${{ secrets.PYPI_API_TOKEN }}
|
|
235
|
+
|
|
236
|
+
- name: Create GitHub Release
|
|
237
|
+
uses: softprops/action-gh-release@v1
|
|
238
|
+
with:
|
|
239
|
+
tag_name: ${{ needs.validate-and-tag.outputs.tag_name }}
|
|
240
|
+
name: Release v${{ github.event.inputs.version }}
|
|
241
|
+
body: |
|
|
242
|
+
## DeltaGlider v${{ github.event.inputs.version }}
|
|
243
|
+
|
|
244
|
+
Published to ${{ github.event.inputs.pypi_environment == 'pypi' && 'PyPI' || 'TestPyPI' }}
|
|
245
|
+
|
|
246
|
+
### Installation
|
|
247
|
+
```bash
|
|
248
|
+
pip install deltaglider==${{ github.event.inputs.version }}
|
|
249
|
+
```
|
|
250
|
+
draft: false
|
|
251
|
+
prerelease: ${{ contains(github.event.inputs.version, '-') }}
|
|
252
|
+
env:
|
|
253
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|