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.
Files changed (86) hide show
  1. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/.github/workflows/ci.yml +0 -26
  2. deltaglider-4.0.1.dev0/.github/workflows/release-manual.yml +249 -0
  3. deltaglider-4.0.1.dev0/.github/workflows/release.yml +253 -0
  4. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/.gitignore +1 -0
  5. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/PKG-INFO +112 -44
  6. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/README.md +110 -41
  7. deltaglider-4.0.1.dev0/command.sh +8 -0
  8. deltaglider-4.0.1.dev0/commit_message.txt +44 -0
  9. deltaglider-4.0.1.dev0/docs/sdk/README.md +285 -0
  10. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/sdk/api.md +141 -1
  11. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/sdk/examples.md +199 -8
  12. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/pyproject.toml +1 -3
  13. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/__init__.py +18 -2
  14. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/_version.py +3 -3
  15. deltaglider-4.0.1.dev0/src/deltaglider/adapters/metrics_cloudwatch.py +215 -0
  16. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/storage_s3.py +73 -2
  17. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/app/cli/main.py +56 -20
  18. deltaglider-4.0.1.dev0/src/deltaglider/client.py +1315 -0
  19. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/core/service.py +287 -1
  20. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider.egg-info/PKG-INFO +112 -44
  21. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider.egg-info/SOURCES.txt +8 -1
  22. deltaglider-4.0.1.dev0/tests/integration/test_client.py +377 -0
  23. deltaglider-4.0.1.dev0/tests/integration/test_recursive_delete_reference_cleanup.py +396 -0
  24. deltaglider-0.3.0.dev0/docs/sdk/README.md +0 -122
  25. deltaglider-0.3.0.dev0/src/deltaglider/client.py +0 -237
  26. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/.dockerignore +0 -0
  27. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/CLAUDE.md +0 -0
  28. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/CONTRIBUTING.md +0 -0
  29. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/Dockerfile +0 -0
  30. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/LICENSE +0 -0
  31. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/MANIFEST.in +0 -0
  32. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/Makefile +0 -0
  33. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/PYPI_RELEASE.md +0 -0
  34. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docker-compose.test.yml +0 -0
  35. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docker-compose.yml +0 -0
  36. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/aws-s3-cli-compatibility.md +0 -0
  37. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/case-study-readonlyrest.md +0 -0
  38. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/deltaglider.png +0 -0
  39. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/deltaglider_architecture_guidelines.txt +0 -0
  40. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/deltaglider_metadata_schema.txt +0 -0
  41. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/deltaglider_specs.txt +0 -0
  42. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/sdk/Makefile +0 -0
  43. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/sdk/architecture.md +0 -0
  44. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/sdk/generate_docs.py +0 -0
  45. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/docs/sdk/getting-started.md +0 -0
  46. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/run-e2e-tests.sh +0 -0
  47. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/setup.cfg +0 -0
  48. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/__init__.py +0 -0
  49. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/cache_fs.py +0 -0
  50. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/clock_utc.py +0 -0
  51. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/diff_xdelta.py +0 -0
  52. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/hash_sha.py +0 -0
  53. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/logger_std.py +0 -0
  54. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/adapters/metrics_noop.py +0 -0
  55. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/app/__init__.py +0 -0
  56. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/app/cli/__init__.py +0 -0
  57. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/app/cli/aws_compat.py +0 -0
  58. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/app/cli/sync.py +0 -0
  59. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/core/__init__.py +0 -0
  60. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/core/errors.py +0 -0
  61. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/core/models.py +0 -0
  62. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/__init__.py +0 -0
  63. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/cache.py +0 -0
  64. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/clock.py +0 -0
  65. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/diff.py +0 -0
  66. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/hash.py +0 -0
  67. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/logger.py +0 -0
  68. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/metrics.py +0 -0
  69. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/ports/storage.py +0 -0
  70. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider/py.typed +0 -0
  71. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider.egg-info/dependency_links.txt +0 -0
  72. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider.egg-info/entry_points.txt +0 -0
  73. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider.egg-info/requires.txt +0 -0
  74. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/src/deltaglider.egg-info/top_level.txt +0 -0
  75. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/__init__.py +0 -0
  76. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/conftest.py +0 -0
  77. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/e2e/__init__.py +0 -0
  78. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/e2e/test_localstack.py +0 -0
  79. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/integration/__init__.py +0 -0
  80. /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
  81. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/integration/test_full_workflow.py +0 -0
  82. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/integration/test_get_command.py +0 -0
  83. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/integration/test_xdelta.py +0 -0
  84. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/unit/__init__.py +0 -0
  85. {deltaglider-0.3.0.dev0 → deltaglider-4.0.1.dev0}/tests/unit/test_adapters.py +0 -0
  86. {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 }}
@@ -1,4 +1,5 @@
1
1
  # Python
2
+ ror-data-importer/
2
3
  __pycache__/
3
4
  *.py[cod]
4
5
  *$py.class