Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
136 commits
Select commit Hold shift + click to select a range
320d9bb
Merge pull request #1 from Intergration-Automation-Testing/dev
JE-Chen May 19, 2023
38cdeff
Merge pull request #2 from Intergration-Automation-Testing/dev
JE-Chen May 27, 2023
9be7a54
Merge pull request #3 from Intergration-Automation-Testing/dev
JE-Chen May 29, 2023
15b05f6
Merge pull request #4 from Intergration-Automation-Testing/dev
JE-Chen May 29, 2023
8f6fae0
Merge pull request #5 from Integration-Automation/dev
JE-Chen May 29, 2023
20c9c19
Merge pull request #6 from Integration-Automation/dev
JE-Chen May 30, 2023
d163489
Merge pull request #7 from Integration-Automation/dev
JE-Chen Jun 3, 2023
1c3a5e3
Merge pull request #8 from Integration-Automation/dev
JE-Chen Jun 3, 2023
7fdd0dd
Merge pull request #9 from Integration-Automation/dev
JE-Chen Jun 4, 2023
ff12f26
Merge pull request #10 from Integration-Automation/dev
JE-Chen Jun 4, 2023
786913d
Merge pull request #11 from Integration-Automation/dev
JE-Chen Jun 5, 2023
d334ace
Merge pull request #12 from Integration-Automation/dev
JE-Chen Jun 7, 2023
4f2f9bb
Merge pull request #13 from Integration-Automation/dev
JE-Chen Jun 8, 2023
2e275dd
Merge pull request #14 from Integration-Automation/dev
JE-Chen Jun 12, 2023
756bb03
Merge pull request #15 from Integration-Automation/dev
JE-Chen Jun 12, 2023
aa9dcef
Merge pull request #16 from Integration-Automation/dev
JE-Chen Jun 13, 2023
f6dc607
Merge pull request #17 from Integration-Automation/dev
JE-Chen Jun 14, 2023
0dcb501
Merge pull request #18 from Integration-Automation/dev
JE-Chen Jun 15, 2023
99c507c
Merge pull request #19 from Integration-Automation/dev
JE-Chen Jul 17, 2023
01dec05
Merge pull request #20 from Integration-Automation/dev
JE-Chen Jul 18, 2023
de28a1b
Merge pull request #21 from Integration-Automation/dev
JE-Chen Jul 21, 2023
7c09204
Merge pull request #22 from Integration-Automation/dev
JE-Chen Aug 3, 2023
1ba038e
Merge pull request #23 from Integration-Automation/dev
JE-Chen Aug 3, 2023
54c215d
Merge pull request #24 from Integration-Automation/dev
JE-Chen Aug 3, 2023
fb1a57a
Merge pull request #25 from Integration-Automation/dev
JE-Chen Aug 3, 2023
3c94a3b
Merge pull request #26 from Integration-Automation/dev
JE-Chen45 Aug 8, 2023
5135021
Merge pull request #29 from Integration-Automation/dev
JE-Chen45 Aug 14, 2023
3780777
Merge pull request #31 from Integration-Automation/dev
JE-Chen Aug 15, 2023
7a4c5be
Merge pull request #32 from Integration-Automation/dev
JE-Chen Aug 17, 2023
4134872
Merge pull request #33 from Integration-Automation/dev
JE-Chen Aug 18, 2023
c8c1229
Merge pull request #34 from Integration-Automation/dev
JE-Chen Aug 18, 2023
2e83540
Merge pull request #36 from Integration-Automation/dev
JE-Chen Jul 11, 2024
ecbbdeb
Merge pull request #37 from Integration-Automation/dev
JE-Chen Jul 22, 2024
93e87fb
Merge pull request #38 from Integration-Automation/dev
JE-Chen Dec 7, 2024
64dd421
Merge pull request #39 from Integration-Automation/dev
JE-Chen Apr 15, 2025
b4e9a57
Merge pull request #40 from Integration-Automation/dev
JE-Chen Jul 12, 2025
3c65bb5
Merge pull request #41 from Integration-Automation/dev
JE-Chen Nov 4, 2025
a942415
Merge pull request #42 from Integration-Automation/dev
JE-Chen Nov 4, 2025
33bc615
Merge pull request #43 from Integration-Automation/dev
JE-Chen Nov 16, 2025
c2e2fa2
Merge pull request #44 from Integration-Automation/dev
JE-Chen Apr 21, 2026
5383386
Merge pull request #45 from Integration-Automation/dev
JE-Chen Apr 21, 2026
f2d1ad3
Merge pull request #46 from Integration-Automation/dev
JE-Chen Apr 21, 2026
f74af8d
Merge pull request #47 from Integration-Automation/dev
JE-Chen Apr 21, 2026
91f74fd
Merge pull request #48 from Integration-Automation/dev
JE-Chen Apr 21, 2026
f74cb6d
Merge pull request #49 from Integration-Automation/dev
JE-Chen Apr 21, 2026
ea9da1e
Merge pull request #50 from Integration-Automation/dev
JE-Chen Apr 21, 2026
ca603c9
chore: bump version to 0.0.32
github-actions[bot] Apr 21, 2026
08660ad
Merge pull request #51 from Integration-Automation/dev
JE-Chen Apr 21, 2026
e3da389
chore: bump version to 0.0.33
github-actions[bot] Apr 21, 2026
712fb4f
Merge pull request #55 from Integration-Automation/dev
JE-Chen Apr 22, 2026
cd1f1e4
chore: bump version to 0.0.34
github-actions[bot] Apr 22, 2026
88ab113
Merge pull request #56 from Integration-Automation/dev
JE-Chen Apr 22, 2026
2b9cae5
chore: bump version to 0.0.35
github-actions[bot] Apr 22, 2026
7b67894
Merge pull request #58 from Integration-Automation/dev
JE-Chen Apr 24, 2026
d2807d9
chore: bump version to 0.0.36
github-actions[bot] Apr 24, 2026
3aeb370
Merge pull request #62 from Integration-Automation/dev
JE-Chen Apr 25, 2026
1733993
chore: bump version to 0.0.37
github-actions[bot] Apr 25, 2026
ea8ceda
Merge pull request #69 from Integration-Automation/dev
JE-Chen Apr 28, 2026
7451287
chore: bump version to 0.0.38
github-actions[bot] Apr 28, 2026
828b2d9
Merge pull request #70 from Integration-Automation/dev
JE-Chen Apr 28, 2026
e68e8e8
chore: bump version to 0.0.39
github-actions[bot] Apr 28, 2026
b673325
Merge pull request #71 from Integration-Automation/dev
JE-Chen Apr 28, 2026
0385639
chore: bump version to 0.0.40
github-actions[bot] Apr 28, 2026
4186f6f
Merge pull request #72 from Integration-Automation/dev
JE-Chen Apr 28, 2026
de455b9
chore: bump version to 0.0.41
github-actions[bot] Apr 28, 2026
3edd3b1
Merge pull request #73 from Integration-Automation/dev
JE-Chen Apr 28, 2026
456b91b
chore: bump version to 0.0.42
github-actions[bot] Apr 28, 2026
ca59089
Merge pull request #74 from Integration-Automation/dev
JE-Chen Apr 28, 2026
21b1400
chore: bump version to 0.0.43
github-actions[bot] Apr 28, 2026
9b5d5a7
Merge pull request #75 from Integration-Automation/dev
JE-Chen Apr 28, 2026
0ea9f4f
chore: bump version to 0.0.44
github-actions[bot] Apr 28, 2026
f8eddb0
Merge pull request #76 from Integration-Automation/dev
JE-Chen Apr 28, 2026
32a9f8f
chore: bump version to 0.0.45
github-actions[bot] Apr 28, 2026
cf262cd
Merge pull request #77 from Integration-Automation/dev
JE-Chen Apr 28, 2026
7e3a7a4
chore: bump version to 0.0.46
github-actions[bot] Apr 28, 2026
94b0f67
Merge pull request #90 from Integration-Automation/dev
JE-Chen Jul 25, 2026
1192b89
chore: bump version to 0.0.47
github-actions[bot] Jul 25, 2026
9f8cbac
Merge pull request #96 from Integration-Automation/dev
JE-Chen Sep 23, 2026
3682a4e
chore: bump version to 0.0.48
github-actions[bot] Sep 23, 2026
cf31a73
Merge pull request #99 from Integration-Automation/dev
JE-Chen Sep 24, 2026
b9cdc5b
chore: bump version to 0.0.49
github-actions[bot] Sep 24, 2026
81f2ace
Merge pull request #100 from Integration-Automation/dev
JE-Chen Sep 24, 2026
fb80aa9
chore: bump version to 0.0.50
github-actions[bot] Sep 24, 2026
74b1bf4
Merge pull request #101 from Integration-Automation/dev
JE-Chen Sep 25, 2026
f2f2b0b
chore: bump version to 0.0.51
github-actions[bot] Sep 25, 2026
31cf5b5
docs: add FileAutomation 1.0 roadmap
JE-Chen Oct 6, 2026
9f487c3
feat: add the universal storage layer with local and memory backends
JE-Chen Oct 8, 2026
f20a150
feat: put S3 and Azure Blob behind the storage layer
JE-Chen Oct 8, 2026
2cfb09f
feat: add FA_storage actions for the storage layer
JE-Chen Oct 8, 2026
2cd7343
refactor: let a storage backend instance carry its own scheme and cap…
JE-Chen Oct 8, 2026
c6f4968
fix: keep version directories short enough for long source paths
JE-Chen Oct 8, 2026
7ae82f9
feat: add streams and directory trees to the storage layer
JE-Chen Oct 8, 2026
16e5eab
feat: add the event model, the event bus and storage observers
JE-Chen Oct 8, 2026
810e507
docs: describe FA_copy_between on the cloud pages instead of a FA_cro…
JE-Chen Oct 8, 2026
c394651
docs: drop drive:// from the architecture diagrams
JE-Chen Oct 8, 2026
43432c7
build: move the backend SDKs and the GUI toolkit under extras
JE-Chen Oct 8, 2026
e90fc87
test: add denied and transient failure cases to the storage contract
JE-Chen Oct 8, 2026
22f9cde
feat: add a storage subcommand to the CLI
JE-Chen Oct 8, 2026
c58b5b3
feat: add storage adapters for eight more backends
JE-Chen Oct 8, 2026
d9416a6
feat: add IntegrityMonitor 2.0
JE-Chen Oct 8, 2026
80f0e0d
feat: add the notification router and audit schema v2
JE-Chen Oct 8, 2026
bfa6f19
feat: add the pipeline runtime
JE-Chen Oct 8, 2026
821df87
feat: add integrity, pipeline and audit subcommands to the CLI
JE-Chen Oct 8, 2026
ba7c455
refactor: run copy_between on the storage layer
JE-Chen Oct 8, 2026
41f3782
docs: add the public API and deprecation policy
JE-Chen Oct 8, 2026
6910e4d
test: add integration tests against real services and their workflow
JE-Chen Oct 8, 2026
541adc9
ci: let a release raise MINOR or MAJOR, and check the package build
JE-Chen Oct 8, 2026
036ebfa
docs: correct the README line that said the backends are installed by…
JE-Chen Oct 8, 2026
240de15
test: add metadata cases to the storage contract
JE-Chen Oct 8, 2026
089c7d7
docs: add the production deployment guide
JE-Chen Oct 8, 2026
e998011
feat: add semantic MCP tools with a permission model
JE-Chen Oct 8, 2026
805dbf0
docs: state one positioning in the READMEs, the manuals and the metadata
JE-Chen Oct 8, 2026
ee437d0
feat: add scheduler v2
JE-Chen Oct 8, 2026
87d8908
feat: add the application layer and UI 2.0
JE-Chen Oct 8, 2026
f446ef9
docs: add the migration guide
JE-Chen Oct 8, 2026
0757995
test: stop an audit test from matching its content in random ids
JE-Chen Oct 8, 2026
d0f945a
fix: correct what the first run against real services and macOS showed
JE-Chen Oct 8, 2026
d578a0b
chore: answer the static-analysis findings of the pull request
JE-Chen Oct 8, 2026
5bff680
chore: shorten the scanner markers and name the S3 test server that i…
JE-Chen Oct 8, 2026
b279492
docs: record the first CI runs of the pull request and what is left
JE-Chen Oct 8, 2026
7ffd7ce
Lock lint and integration dependencies and resolve main review findings
JE-Chen Oct 8, 2026
1f416ad
Freeze the limiter clock while testing concurrent burst capacity
JE-Chen Oct 8, 2026
1a2718f
Close the shared Qt application before interpreter shutdown
JE-Chen Oct 8, 2026
58b6bc8
Keep GUI installs on the verified Qt 6.11 series
JE-Chen Oct 8, 2026
ef8c06f
Archive the completed main pull request validation
JE-Chen Oct 8, 2026
4d51cb9
Record the integrated PyBreeze dependency compatibility fix
JE-Chen Oct 8, 2026
89a2617
Merge pull request #110 from Integration-Automation/feat/universal-st…
JE-Chen Oct 8, 2026
0a91733
chore: bump version to 0.0.52
github-actions[bot] Oct 8, 2026
12413e7
Merge remote-tracking branch 'origin/dev' into feat/universal-storage…
JE-Chen Oct 11, 2026
c2eb007
Merge pull request #107 from Integration-Automation/docs/fileautomati…
JE-Chen Oct 11, 2026
4418322
Merge dev and retain legacy CLI failure reporting
JE-Chen Oct 11, 2026
67b8c29
Merge remote-tracking branch 'origin/docs/fileautomation-1.0-roadmap'…
JE-Chen Oct 11, 2026
1efab72
Merge remote-tracking branch 'origin/dev' into feat/universal-storage…
JE-Chen Oct 11, 2026
d8837ac
Make circuit breaker state tests independent of wall clock timing
JE-Chen Oct 11, 2026
4669677
Merge remote-tracking branch 'origin/main' into feat/universal-storag…
JE-Chen Oct 11, 2026
013961a
Record full pull request validation results
JE-Chen Oct 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
# Auto detect text files and perform LF normalization
* text=auto
# Shell scripts run under bash on Linux runners, which does not accept CRLF.
*.sh text eol=lf
33 changes: 33 additions & 0 deletions .github/requirements/integration.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Python 3.12 integration dependencies, locked for all runner platforms.
# Regenerate: uv pip compile --universal --python-version 3.12 --generate-hashes
# --only-binary :all: --exclude-newer 2026-10-02T00:00:00Z
# .github/requirements/integration.in -o .github/requirements/integration.txt
setuptools>=77
wheel
requests>=2.31.0
tqdm>=4.66.0
watchdog>=4.0.0
cryptography>=50.0.0
prometheus_client>=0.26.0
defusedxml>=0.7.1
je_action_core>=0.0.2
PyYAML>=6.0.3
tzdata>=2024.1; platform_system == 'Windows'
opentelemetry-api>=1.44.0
opentelemetry-sdk>=1.44.0
tomli>=2.0.1; python_version<"3.11"
boto3>=1.34.0
azure-storage-blob>=12.19.0
google-api-python-client>=2.100.0
google-auth-httplib2>=0.2.0
google-auth-oauthlib>=1.2.0
dropbox>=11.36.2
paramiko>=3.4.0
smbprotocol>=1.13.0
fsspec>=2024.2.0
msal>=1.39.0
boxsdk>=10.15.0,<11
pyarrow>=25.0.1
PySide6>=6.11.2,<6.12
pytest>=8.0.0
pytest-cov>=5.0.0
1,152 changes: 1,152 additions & 0 deletions .github/requirements/integration.txt

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions .github/requirements/lint.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Regenerate with uv pip compile --generate-hashes --python-version 3.12
# --only-binary :all: --exclude-newer 2026-10-02T00:00:00Z
# .github/requirements/lint.in -o .github/requirements/lint.txt
ruff
mypy
je_action_core>=0.0.2
290 changes: 290 additions & 0 deletions .github/requirements/lint.txt

Large diffs are not rendered by default.

83 changes: 77 additions & 6 deletions .github/workflows/ci-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,8 @@ jobs:
cache: pip
- name: Install tooling
run: |
python -m pip install --upgrade pip
# mypy reads je_action_core's types (py.typed) for the classes built on it
pip install ruff mypy "je_action_core>=0.0.2"
# mypy reads the action engine types from the hash-locked tooling.
python -m pip install --require-hashes --only-binary :all: -r .github/requirements/lint.txt
- name: Ruff check
run: ruff check automation_file tests
- name: Ruff format check
Expand Down Expand Up @@ -56,8 +55,8 @@ jobs:
run: |
python -m pip install --upgrade pip wheel
Copy-Item dev.toml pyproject.toml -Force
pip install -e .
pip install pytest pytest-cov
# Every extra, so every backend's tests run. The minimal job runs without any.
pip install -e ".[all,test]"
- name: Run pytest with coverage
run: python -m pytest tests/ -v --tb=short --cov=automation_file --cov-report=term-missing --cov-report=xml
- name: Upload coverage artifact
Expand All @@ -67,12 +66,84 @@ jobs:
name: coverage-xml
path: coverage.xml

minimal:
# The base install: no cloud SDK and no GUI toolkit. The tests of a backend whose extra is
# missing skip; everything else, the import guard included, has to pass.
needs: lint
runs-on: windows-latest
timeout-minutes: 15 # no run yet: the floor of 15 minutes, to revisit after the first runs
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.12"
cache: pip
- name: Install the base package
run: |
python -m pip install --upgrade pip wheel
Copy-Item dev.toml pyproject.toml -Force
pip install -e ".[test]"
- name: Run pytest
run: python -m pytest tests/ -v --tb=short

extras:
# Each extra on its own: it installs, and its backend's tests run with no other SDK present.
needs: lint
runs-on: windows-latest
timeout-minutes: 15 # no run yet: the floor of 15 minutes, to revisit after the first runs
strategy:
fail-fast: false
matrix:
extra: [ s3, azure, gdrive, dropbox, sftp, ftp, webdav, smb, fsspec, onedrive, box, parquet, gui ]
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.12"
cache: pip
- name: Install the package with one extra
run: |
python -m pip install --upgrade pip wheel
Copy-Item dev.toml pyproject.toml -Force
pip install -e ".[${{ matrix.extra }},test]"
- name: Run pytest
run: python -m pytest tests/ -v --tb=short

package:
# The sdist and the wheel build from dev.toml and their metadata renders, before anything is
# merged. It gates nothing: the publish job builds again from the locked tools.
needs: lint
runs-on: ubuntu-latest
timeout-minutes: 15 # no run yet: the floor of 15 minutes, to revisit after the first runs
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.12"
cache: pip
- name: Build the distribution and check its metadata
run: |
# The locked, wheels-only tools the publish jobs build with.
python -m pip install --require-hashes --only-binary :all: -r .github/requirements/publish.txt
cp dev.toml pyproject.toml
python -m build --no-isolation
twine check dist/*

publish-dev:
# The dev channel. A push to dev that passes lint and the tests is built from dev.toml and uploaded
# when it is still the tip of dev and ships something the newest automation_file_dev does not.
# scripts/dev_release.py picks the version from PyPI, so nothing is committed back.
name: Publish automation_file_dev to PyPI
needs: [lint, pytest]
needs: [lint, pytest, minimal, extras]
if: github.event_name == 'push' && github.ref == 'refs/heads/dev'
runs-on: ubuntu-latest
timeout-minutes: 15 # about 3x the slowest recent run, at least 15
Expand Down
81 changes: 76 additions & 5 deletions .github/workflows/ci-stable.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,8 @@ jobs:
cache: pip
- name: Install tooling
run: |
python -m pip install --upgrade pip
# mypy reads je_action_core's types (py.typed) for the classes built on it
pip install ruff mypy "je_action_core>=0.0.2"
# mypy reads the action engine types from the hash-locked tooling.
python -m pip install --require-hashes --only-binary :all: -r .github/requirements/lint.txt
- name: Ruff check
run: ruff check automation_file tests
- name: Ruff format check
Expand Down Expand Up @@ -56,8 +55,8 @@ jobs:
run: |
python -m pip install --upgrade pip wheel
Copy-Item stable.toml pyproject.toml -Force
pip install -e .
pip install pytest pytest-cov
# Every extra, so every backend's tests run. The minimal job runs without any.
pip install -e ".[all,test]"
- name: Run pytest with coverage
run: python -m pytest tests/ -v --tb=short --cov=automation_file --cov-report=term-missing --cov-report=xml
- name: Upload coverage artifact
Expand All @@ -66,3 +65,75 @@ jobs:
with:
name: coverage-xml
path: coverage.xml

minimal:
# The base install: no cloud SDK and no GUI toolkit. The tests of a backend whose extra is
# missing skip; everything else, the import guard included, has to pass.
needs: lint
runs-on: windows-latest
timeout-minutes: 15 # no run yet: the floor of 15 minutes, to revisit after the first runs
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.12"
cache: pip
- name: Install the base package
run: |
python -m pip install --upgrade pip wheel
Copy-Item stable.toml pyproject.toml -Force
pip install -e ".[test]"
- name: Run pytest
run: python -m pytest tests/ -v --tb=short

extras:
# Each extra on its own: it installs, and its backend's tests run with no other SDK present.
needs: lint
runs-on: windows-latest
timeout-minutes: 15 # no run yet: the floor of 15 minutes, to revisit after the first runs
strategy:
fail-fast: false
matrix:
extra: [ s3, azure, gdrive, dropbox, sftp, ftp, webdav, smb, fsspec, onedrive, box, parquet, gui ]
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.12"
cache: pip
- name: Install the package with one extra
run: |
python -m pip install --upgrade pip wheel
Copy-Item stable.toml pyproject.toml -Force
pip install -e ".[${{ matrix.extra }},test]"
- name: Run pytest
run: python -m pytest tests/ -v --tb=short

package:
# The sdist and the wheel build from stable.toml and their metadata renders, before anything is
# merged. It gates nothing: the publish job builds again from the locked tools.
needs: lint
runs-on: ubuntu-latest
timeout-minutes: 15 # no run yet: the floor of 15 minutes, to revisit after the first runs
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.12"
cache: pip
- name: Build the distribution and check its metadata
run: |
# The locked, wheels-only tools the publish jobs build with.
python -m pip install --require-hashes --only-binary :all: -r .github/requirements/publish.txt
cp stable.toml pyproject.toml
python -m build --no-isolation
twine check dist/*
87 changes: 87 additions & 0 deletions .github/workflows/integration.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
name: Integration

# The storage contract suite against real services, and the unit tests on the other two platforms.
# Neither job gates a release: publishing depends on the jobs of ci-dev.yml and ci-stable.yml.

on:
pull_request:
branches: [ "dev", "main" ]
push:
branches: [ "dev" ]
schedule:
- cron: "30 3 * * *"
workflow_dispatch:

permissions:
contents: read

concurrency:
group: integration-${{ github.ref }}
cancel-in-progress: true

jobs:
services:
# One service per job, each started in a container by tests/integration/start_service.sh.
# FA_IT_REQUIRED turns a test module that would skip (its variables are missing) into an error.
runs-on: ubuntu-latest
timeout-minutes: 20 # no run yet: to revisit after the first runs
strategy:
fail-fast: false
matrix:
service: [ s3, azure, sftp, ftp, webdav, smb ]
env:
SERVICE: ${{ matrix.service }}
FA_IT_REQUIRED: "1"
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.12"
cache: pip
- name: Install the package with every extra
run: |
python -m pip install --require-hashes --only-binary :all: -r .github/requirements/integration.txt
cp dev.toml pyproject.toml
python -m pip install --no-deps --no-build-isolation --only-binary :all: -e .
- name: Start the service
run: bash tests/integration/start_service.sh "$SERVICE"
- name: Run the contract suite against it
run: python -m pytest tests/integration/test_"$SERVICE"_*.py -v --tb=short
- name: Show the service log
if: failure()
run: docker logs "fa-it-$SERVICE" || true

platforms:
# ci-dev.yml and ci-stable.yml run the unit tests on Windows. These are the other two.
runs-on: ${{ matrix.os }}
timeout-minutes: 20 # no run yet: to revisit after the first runs
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest, macos-latest ]
env:
QT_QPA_PLATFORM: offscreen
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.12"
cache: pip
- name: Install the libraries Qt needs without a display
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends libegl1 libgl1 libxkbcommon0 libdbus-1-3 libfontconfig1
- name: Install the package with every extra
run: |
python -m pip install --require-hashes --only-binary :all: -r .github/requirements/integration.txt
cp dev.toml pyproject.toml
python -m pip install --no-deps --no-build-isolation --only-binary :all: -e .
- name: Run pytest
run: python -m pytest tests/ -v --tb=short
36 changes: 4 additions & 32 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,39 +33,11 @@ jobs:
run: |
python -m pip install --require-hashes --only-binary :all: -r .github/requirements/publish.txt

- name: Bump patch version in stable.toml and dev.toml
# A patch release unless the pull request raised MAJOR or MINOR in stable.toml and dev.toml.
# scripts/stable_release.py says how the two are told apart.
- name: Pick the release version in stable.toml and dev.toml
id: bump
run: |
python <<'EOF'
import os
import pathlib
import re

def bump(path: pathlib.Path) -> str:
text = path.read_text(encoding="utf-8")
match = re.search(r'^version\s*=\s*"(\d+)\.(\d+)\.(\d+)"', text, re.MULTILINE)
if not match:
raise SystemExit(f"Could not find version in {path}")
major, minor, patch = (int(part) for part in match.groups())
new_version = f"{major}.{minor}.{patch + 1}"
new_text = re.sub(
r'^(version\s*=\s*)"\d+\.\d+\.\d+"',
rf'\1"{new_version}"',
text,
count=1,
flags=re.MULTILINE,
)
path.write_text(new_text, encoding="utf-8")
return new_version

stable_version = bump(pathlib.Path("stable.toml"))
dev_version = bump(pathlib.Path("dev.toml"))
with open(os.environ["GITHUB_OUTPUT"], "a", encoding="utf-8") as output:
output.write(f"new_version={stable_version}\n")
output.write(f"dev_version={dev_version}\n")
print(f"stable.toml -> {stable_version}")
print(f"dev.toml -> {dev_version}")
EOF
run: python scripts/stable_release.py bump

- name: Use stable.toml as pyproject.toml
run: cp stable.toml pyproject.toml
Expand Down
Loading
Loading