From 36520e240ab77f4ce97ce191534a92c32234a839 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Sep 2025 17:11:18 +0300 Subject: [PATCH 01/28] Change pull_request to pull_request_target --- .github/workflows/semantic-pull-request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/semantic-pull-request.yml b/.github/workflows/semantic-pull-request.yml index 26b2dec0..7179ead3 100644 --- a/.github/workflows/semantic-pull-request.yml +++ b/.github/workflows/semantic-pull-request.yml @@ -3,7 +3,7 @@ name: 🔍 Semantic PR Validation on: - pull_request: + pull_request_target: branches: - main types: @@ -113,4 +113,4 @@ jobs: repo: context.repo.repo, name: 'invalid', }); - } \ No newline at end of file + } From ba25a3fbe485b964c446e7f1a95189a9f4dcbb88 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Sun, 14 Dec 2025 16:06:40 +0200 Subject: [PATCH 02/28] Create python313support.md --- python313support.md | 445 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 445 insertions(+) create mode 100644 python313support.md diff --git a/python313support.md b/python313support.md new file mode 100644 index 00000000..7cb44d62 --- /dev/null +++ b/python313support.md @@ -0,0 +1,445 @@ +# Python 3.13 Support Specification + +## Overview + +This specification outlines the requirements and implementation plan for adding Python 3.13 support to the Microsoft Fabric CLI, in addition to the currently supported versions (3.10, 3.11, and 3.12). + +## Background + +### Current State +- **Supported Python Versions**: 3.10, 3.11, 3.12 +- **Blocking Dependency**: `msal[broker]` which depends on `pymsalruntime` +- **Historical Issue**: `pymsalruntime` lacked Python 3.13 support until recently + +### Recent Development +- **pymsalruntime 0.18.1** (released in late 2024) officially added Python 3.13 support +- This removes the primary blocker for Fabric CLI Python 3.13 compatibility + +## Goals + +1. **Add Python 3.13 as a supported version** for the Fabric CLI +2. **Maintain backward compatibility** with Python 3.10, 3.11, and 3.12 +3. **Update all configuration and CI/CD pipelines** to test against Python 3.13 +4. **Ensure all dependencies are compatible** with Python 3.13 +5. **Update documentation** to reflect the new supported version + +## Technical Assessment + +### Dependency Analysis + +#### Critical Dependencies +| Dependency | Current Constraint | Python 3.13 Status | Action Required | +|------------|-------------------|-------------------|-----------------| +| `msal[broker]` | `>=1.29,<2` | ✅ Supported via pymsalruntime 0.18.1+ | Verify minimum version | +| `msal_extensions` | No version constraint | ✅ Compatible | None | +| `questionary` | No version constraint | ✅ Compatible | None | +| `prompt_toolkit` | `>=3.0.41` | ✅ Compatible | None | +| `cachetools` | `>=5.5.0` | ✅ Compatible | None | +| `jmespath` | No version constraint | ✅ Compatible | None | +| `pyyaml` | `==6.0.2` | ✅ Compatible | None | +| `argcomplete` | `>=3.6.2` | ✅ Compatible | None | +| `psutil` | `==7.0.0` | ✅ Compatible (3.13 wheels available) | None | + +#### Test Dependencies +| Dependency | Current Constraint | Python 3.13 Status | Notes | +|------------|-------------------|-------------------|-------| +| `pytest` | `>=8.2.1` | ✅ Compatible | - | +| `pytest-cov` | No version constraint | ✅ Compatible | - | +| `vcrpy` | No version constraint | ✅ Compatible | - | +| `urllib3` | `<2.3.0,>=2.0.0` | ✅ Compatible | See urllib3 analysis below | + +#### Development Dependencies +| Dependency | Python 3.13 Status | +|------------|-------------------| +| `black` | ✅ Compatible | +| `mypy` | ✅ Compatible | +| `tox` | ✅ Compatible (>=4.20.0) | + +#### urllib3 Version Analysis + +**Current Constraint**: `urllib3<2.3.0,>=2.0.0` +**Proposed Update**: `urllib3<2.7.0,>=2.0.0` + +**Context**: +- urllib3 is used as a **test dependency only** (in `requirements.txt` and `tox.toml`) +- Not listed in `pyproject.toml` runtime dependencies +- Used indirectly via `requests` library (which depends on urllib3) +- Direct import found only in test code: [`tests/test_commands/api_processors/capacities_api_processor.py`](../../tests/test_commands/api_processors/capacities_api_processor.py:7) + +**urllib3 Version Compatibility**: +| Version | Python 3.13 Support | Status | Notes | +|---------|-------------------|--------|-------| +| 2.2.x | ✅ Full support | Current in use (per NOTICE.txt: 2.2.3) | Stable | +| 2.3.x - 2.6.x | ✅ Full support | Available | Includes security fixes | +| 2.7.x | ✅ Full support | Latest (as of Dec 2024) | Python 3.13 wheels available | + +**Requests Library Compatibility**: +- `requests` 2.32.5 (current version per NOTICE.txt) supports urllib3 v2.x +- No upper bound specified in requests for urllib3 2.x series +- requests pins: `urllib3>=1.21.1,<3` + +**Benefits of Updating to <2.7.0**: +1. ✅ **Security patches**: Access to latest security fixes in urllib3 2.3.x - 2.6.x +2. ✅ **Python 3.13 optimization**: Better support for Python 3.13 features +3. ✅ **Future-proof**: Extends compatibility window +4. ✅ **Bug fixes**: Access to bug fixes in newer versions +5. ✅ **Backwards compatible**: urllib3 2.x maintains API compatibility + +**Risk Assessment**: +- **Risk Level**: âš ī¸ **Low-Medium** +- **Primary Concern**: urllib3 2.3+ introduced some behavioral changes +- **Mitigation**: Comprehensive testing required + +**Breaking Changes in urllib3 2.3+**: +- urllib3 2.3.0+ removed support for Python 3.7 +- Some deprecated APIs removed (but Fabric CLI doesn't use deprecated features) +- Minor changes to SSL/TLS handling (unlikely to affect CLI) + +**Testing Required**: +1. ✅ Test suite passes with urllib3 2.6.x +2. ✅ VCR cassette playback works correctly +3. ✅ API processor tests function properly (especially `capacities_api_processor.py`) +4. ✅ No breaking changes in test utilities + +**Recommendation**: ✅ **Proceed with Update** + +The update to `urllib3<2.7.0` is recommended for: +- Enhanced Python 3.13 compatibility +- Access to security patches +- Alignment with modern dependency practices + +However, this should be tested thoroughly as part of the Python 3.13 support implementation. + +### Code Compatibility Analysis + +Based on the codebase scan: + +#### Typing Module Usage +- **Finding**: Extensive use of `typing` module (74 occurrences) +- **Status**: ✅ All typing constructs used (`Optional`, `List`, `Dict`, `Any`, `Union`, `Literal`, `NamedTuple`) are compatible with Python 3.13 +- **Action**: None required + +#### Language Features +- **No Python 3.13-incompatible features detected** +- **Standard library usage**: All imports use stable APIs +- **No deprecated features**: Code doesn't rely on features removed in 3.13 + +#### Potential Considerations +1. **Type hints**: Python 3.13 continues to support all type hint syntax used in the codebase +2. **MSAL broker authentication**: Relies on `pymsalruntime` - now supported +3. **String encoding**: No issues detected with f-strings or string operations +4. **Exception handling**: Uses standard patterns compatible with 3.13 + +## Implementation Plan + +### Phase 1: Configuration Updates + +#### 1.1 Update pyproject.toml +**File**: [`pyproject.toml`](../../pyproject.toml) + +**Changes Required**: +```toml +# Line 13: Update Python version constraint +requires-python=">=3.10,<3.14" + +# Lines 15-20: Add Python 3.13 classifier +classifiers = [ + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Operating System :: OS Independent", +] +``` + +**Risk**: Low - straightforward version constraint update + +#### 1.2 Update tox.toml +**File**: [`tox.toml`](../../tox.toml) + +**Changes Required**: +```toml +# Line 2: Add py313 to test environment list +env_list = ["lint", "type", "py310", "py311", "py312", "py313"] + +# Line 71: Add py313 to Black target versions +target-version = ['py310', 'py311', 'py312', 'py313'] +``` + +**Risk**: Low - extends existing test matrix + +### Phase 2: CI/CD Pipeline Updates + +#### 2.1 Update GitHub Actions Workflow +**File**: [`.github/workflows/fab-build.yml`](../../.github/workflows/fab-build.yml) + +**Changes Required**: +```yaml +# Lines 74-81: Add Python 3.13 to test matrix +strategy: + matrix: + include: + - python-version: "3.10" + tox-env: "py310" + - python-version: "3.11" + tox-env: "py311" + - python-version: "3.12" + tox-env: "py312" + - python-version: "3.13" + tox-env: "py313" +``` + +**Risk**: Low - extends existing matrix strategy + +#### 2.2 Update Dev Container (Optional) +**File**: [`.devcontainer/devcontainer.json`](../../.devcontainer/devcontainer.json) + +**Current**: Uses Python 3.10 base image +**Recommendation**: Keep current version or update to 3.12+ as it supports development for all versions +**Risk**: Low - optional update, current container works for development + +### Phase 3: Documentation Updates + +#### 3.1 Update README.md +**File**: [`README.md`](../../README.md) + +**Changes Required**: +```markdown +# Line 59: Update prerequisites +- **Python 3.10, 3.11, 3.12, or 3.13** +``` + +**Risk**: None - documentation only + +#### 3.2 Update Example Files +**File**: [`docs/examples/files/github-workflow.yml`](../examples/files/github-workflow.yml) + +**Changes Required** (Optional): +```yaml +# Line 27: Consider updating example to use 3.13 +python-version: "3.13" +``` + +**Risk**: None - example file only, can keep as 3.12 for stability + +### Phase 4: Dependency Verification + +#### 4.1 Verify pymsalruntime Minimum Version +**Recommended Action**: Test that `msal[broker]>=1.29` properly installs pymsalruntime 0.18.1+ on Python 3.13 + +**Verification Steps**: +```bash +# In Python 3.13 environment +pip install "msal[broker]>=1.29,<2" +python -c "import pymsalruntime; print(pymsalruntime.__version__)" +# Should be >= 0.18.1 +``` + +**Risk**: Medium - if older pymsalruntime is installed, broker authentication may fail + +**Mitigation**: Consider adding explicit minimum version constraint if needed: +```toml +# In pyproject.toml dependencies (if required) +"msal[broker]>=1.31,<2", +``` + +#### 4.2 Update urllib3 Version Constraint +**Files to Update**: +- [`requirements.txt`](../../requirements.txt:4) +- [`tox.toml`](../../tox.toml:12) + +**Current**: `urllib3<2.3.0,>=2.0.0` +**Proposed**: `urllib3<2.7.0,>=2.0.0` + +**Changes Required**: + +**requirements.txt**: +```txt +urllib3<2.7.0,>=2.0.0 +``` + +**tox.toml**: +```toml +deps = [ + "pytest>=8", + "pytest-sugar", + "pytest-cov", + "vcrpy", + "urllib3<2.7.0,>=2.0.0", +] +``` + +**Verification Steps**: +```bash +# Test with updated urllib3 +pip install "urllib3<2.7.0,>=2.0.0" +python -c "import urllib3; print(urllib3.__version__)" +# Should be >= 2.0.0 and < 2.7.0 + +# Run test suite +tox -e py313 +# All tests should pass +``` + +**Risk**: Low-Medium - urllib3 is test-only dependency with good backwards compatibility + +**Testing Focus**: +- VCR cassette playback in tests +- API processor functionality +- No regression in existing test suites + +### Phase 5: Testing & Validation + +#### 5.1 Local Testing +**Test Matrix**: +- ✅ Unit tests on Python 3.13 +- ✅ Integration tests on Python 3.13 +- ✅ Type checking on Python 3.13 +- ✅ Linting on Python 3.13 +- ✅ Build package on Python 3.13 + +#### 5.2 Feature Testing +**Critical Features to Test on Python 3.13**: +1. **Authentication**: + - Interactive login with broker + - Service principal authentication + - Managed identity authentication + - Federated token authentication + +2. **File System Operations**: + - `ls`, `cd`, `pwd`, `mkdir`, `rm` + - OneLake file operations + - Import/export + +3. **API Operations**: + - REST API calls + - JMESPath filtering + +4. **Job Management**: + - Job execution + - Status polling + +#### 5.3 Cross-Version Compatibility Testing +**Verify**: +- Code works on all versions (3.10, 3.11, 3.12, 3.13) +- No regressions in existing versions +- Consistent behavior across versions + +## Risk Assessment + +### Low Risk Items +- ✅ Configuration file updates +- ✅ Documentation updates +- ✅ CI/CD pipeline extensions +- ✅ Standard library compatibility + +### Medium Risk Items +- âš ī¸ **pymsalruntime version verification**: Need to confirm msal[broker] pulls correct version +- âš ī¸ **Broker authentication on 3.13**: Primary use case for pymsalruntime dependency + +### Mitigation Strategies + +1. **Phased Rollout**: + - Add 3.13 support in pre-release + - Gather community feedback + - Monitor for issues before stable release + +2. **Comprehensive Testing**: + - Run full test suite on Python 3.13 + - Manual testing of broker authentication + - Verify on multiple platforms (Windows, macOS, Linux) + +3. **Documentation**: + - Clearly communicate 3.13 as newly supported + - Note any platform-specific considerations + - Provide troubleshooting guidance + +## Implementation Checklist + +### Pre-Implementation +- [ ] Create GitHub issue for Python 3.13 support +- [ ] Verify pymsalruntime 0.18.1+ availability on PyPI +- [ ] Test msal[broker] installation on Python 3.13 environment + +### Core Implementation +- [ ] Update [`pyproject.toml`](../../pyproject.toml) (version constraint + classifiers) +- [ ] Update [`tox.toml`](../../tox.toml) (test environments + urllib3 version) +- [ ] Update [`.github/workflows/fab-build.yml`](../../.github/workflows/fab-build.yml) (CI matrix) +- [ ] Update [`README.md`](../../README.md) (prerequisites) +- [ ] Update [`requirements.txt`](../../requirements.txt) (urllib3 version) + +### Testing +- [ ] Run `tox -e py313` locally +- [ ] Verify all unit tests pass +- [ ] Verify all integration tests pass +- [ ] Test broker authentication on Python 3.13 +- [ ] Test urllib3 2.6.x compatibility with VCR cassettes +- [ ] Test API processor functionality with updated urllib3 +- [ ] Test on Windows with Python 3.13 +- [ ] Test on macOS with Python 3.13 +- [ ] Test on Linux with Python 3.13 + +### Documentation +- [ ] Update installation documentation +- [ ] Update contributing guide if needed +- [ ] Add Python 3.13 to supported versions in all docs +- [ ] Create changelog entry using `changie new` + +### Release +- [ ] Create pull request with all changes +- [ ] Run full CI/CD pipeline +- [ ] Review and approve PR +- [ ] Merge to main +- [ ] Create release with updated PyPI package +- [ ] Announce Python 3.13 support + +## Timeline Estimate + +| Phase | Estimated Time | Dependencies | +|-------|---------------|--------------| +| Configuration Updates | 1-2 hours | None | +| CI/CD Updates | 1-2 hours | Configuration complete | +| urllib3 Update & Testing | 2-3 hours | Configuration complete | +| Documentation | 1 hour | None | +| Testing & Validation | 4-8 hours | All updates complete | +| PR Review & Merge | 1-2 days | Testing complete | +| **Total** | **2-3 days** | - | + +## Success Criteria + +1. ✅ Python 3.13 listed as supported version in PyPI +2. ✅ All CI/CD tests pass on Python 3.13 +3. ✅ Package installs successfully via `pip install ms-fabric-cli` on Python 3.13 +4. ✅ All authentication methods work on Python 3.13 +5. ✅ No regressions in Python 3.10, 3.11, or 3.12 +6. ✅ Documentation updated across all relevant files + +## Post-Implementation + +### Monitoring +- Monitor GitHub issues for Python 3.13-specific problems +- Track PyPI download statistics by Python version +- Gather community feedback on 3.13 compatibility + +### Future Considerations +- **Python 3.14**: Begin planning when Python 3.14 enters beta +- **Deprecation**: Consider Python 3.10 deprecation timeline (follow Python EOL dates) +- **Type System**: Leverage newer Python 3.13 type system features in future updates + +## References + +- [Python 3.13 Release Notes](https://docs.python.org/3.13/whatsnew/3.13.html) +- [pymsalruntime 0.18.1 Release](https://pypi.org/project/pymsalruntime/0.18.1/) +- [msal-python GitHub](https://github.com/AzureAD/microsoft-authentication-library-for-python) +- [Python Packaging User Guide](https://packaging.python.org/) + +## Conclusion + +Adding Python 3.13 support to the Fabric CLI is a **low-risk, high-value enhancement** that: +- Keeps the CLI current with the latest Python releases +- Enables users on Python 3.13 to use the tool +- Demonstrates active maintenance and community support +- Requires minimal code changes due to careful dependency management + +The primary blocker (`pymsalruntime`) has been resolved, and no breaking changes in Python 3.13 affect the current codebase. Implementation can proceed with confidence following the outlined plan. From 55020f077694e45ca67d9ff6a940c5e44d286173 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 03/28] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 852b6b7f..1d912e3d 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From beb01490bffaf32ff5321eb53f91264f535a3ea1 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 04/28] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 98a1aa04..479c7cb5 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From ca313c305ad010157171ee7bfd9af66dc9a5d957 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 05/28] Introduce release workflow --- .github/workflows/create-release.yml | 37 ++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/create-release.yml diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml new file mode 100644 index 00000000..819cd8cf --- /dev/null +++ b/.github/workflows/create-release.yml @@ -0,0 +1,37 @@ +name: 🚀 Create GitHub Release + +on: + workflow_dispatch: + inputs: + version: + description: 'The version to release (e.g., v1.2.0)' + required: true + +jobs: + create-release: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up release variables + id: set_vars + run: | + VERSION="${{ github.event.inputs.version }}" + echo "tag_name=$VERSION" >> $GITHUB_OUTPUT + echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT + + - name: Validate release notes file + run: | + if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then + echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" + exit 1 + fi + + - name: Create Release with GitHub CLI + run: | + gh release create ${{ steps.set_vars.outputs.tag_name }} \ + --title "${{ steps.set_vars.outputs.tag_name }}" \ + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file From 39f2d851274d5d302ba9caeaf0a3768a69e13c2c Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 06/28] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 819cd8cf..e8dd7f15 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -31,7 +31,9 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" From 5e3b68e2d33a6373f56631b15e6b17abc05e2b33 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 07/28] Initial plan From 7c573b0285782f74cafea72d6db1d7b5c145c5b6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 08/28] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 124 ++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index e8dd7f15..4494fd73 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,6 +6,10 @@ on: version: description: 'The version to release (e.g., v1.2.0)' required: true + commit_sha: + description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' + required: false + default: '' jobs: create-release: @@ -15,25 +19,137 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 # Required to access full commit history for validation + + - name: Display workflow information + run: | + echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY + echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY + if [ -n "${{ github.event.inputs.commit_sha }}" ]; then + echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + else + echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + + - name: Validate commit SHA (if provided) + if: ${{ github.event.inputs.commit_sha != '' }} + run: | + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then + echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY + echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY + echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY + echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Invalid commit SHA: $COMMIT_SHA" + exit 1 + fi + echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + + # Use provided commit SHA or default to HEAD + if [ -n "$COMMIT_SHA" ]; then + TARGET_COMMIT="$COMMIT_SHA" + else + TARGET_COMMIT="HEAD" + fi + echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT + echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT + + # Get the actual commit SHA for display + ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") + echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT + + echo "✅ Release variables set:" + echo " - Tag name: $VERSION" + echo " - Target commit: $ACTUAL_SHA" + echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then - echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" + CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" + if [ ! -f "$CHANGELOG_FILE" ]; then + echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY + echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY + echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: GH_TOKEN: ${{ github.token }} run: | - gh release create ${{ steps.set_vars.outputs.tag_name }} \ + echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Create the release with the target commit + if gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ + --target "${{ steps.set_vars.outputs.target_commit }}"; then + + echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY + echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY + echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY + echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY + echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY + echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Failed to create release" + exit 1 + fi From c712eb004327e7916ea95f224266af4fe0a6d413 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 19:21:09 +0000 Subject: [PATCH 09/28] Update python 3.13 support --- .changes/unreleased/optimization-20251217-135023.yaml | 3 +++ .github/workflows/fab-build.yml | 2 ++ README.md | 2 +- pyproject.toml | 3 ++- requirements.txt | 2 +- tox.toml | 6 +++--- 6 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 .changes/unreleased/optimization-20251217-135023.yaml diff --git a/.changes/unreleased/optimization-20251217-135023.yaml b/.changes/unreleased/optimization-20251217-135023.yaml new file mode 100644 index 00000000..6d554eaf --- /dev/null +++ b/.changes/unreleased/optimization-20251217-135023.yaml @@ -0,0 +1,3 @@ +kind: optimization +body: Add python 3.13 support +time: 2025-12-17T13:50:23.175816263Z diff --git a/.github/workflows/fab-build.yml b/.github/workflows/fab-build.yml index e24452cd..9f2fbcbb 100644 --- a/.github/workflows/fab-build.yml +++ b/.github/workflows/fab-build.yml @@ -79,6 +79,8 @@ jobs: tox-env: "py311" - python-version: "3.12" tox-env: "py312" + - python-version: "3.13" + tox-env: "py313" steps: - uses: actions/checkout@v3 diff --git a/README.md b/README.md index c56080a1..d40cf088 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ Navigate Microsoft Fabric like your local file system with intuitive commands: ## đŸ“Ļ Installation ### Prerequisites -- **Python 3.10, 3.11, or 3.12** +- **Python 3.10, 3.11, 3.12, or 3.13** - A **Microsoft Fabric** account with access to your tenant/workspaces. ### Install via pip diff --git a/pyproject.toml b/pyproject.toml index a80defbf..accdaded 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,13 +10,14 @@ authors = [ version="1.3.1" description="Command-line tool for Microsoft Fabric" readme="README.md" -requires-python=">=3.10,<3.13" +requires-python=">=3.10,<3.14" license="MIT" classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Operating System :: OS Independent", ] diff --git a/requirements.txt b/requirements.txt index dc0b5043..d4aa02b7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ setuptools>=65.5.1 pip>=9.0.1 tox>=4.20.0 -urllib3<2.3.0,>=2.0.0 +urllib3<2.7.0,>=2.0.0 build prompt_toolkit requests diff --git a/tox.toml b/tox.toml index a02fd7e3..2daaf960 100644 --- a/tox.toml +++ b/tox.toml @@ -1,5 +1,5 @@ requires = ["tox>=4"] -env_list = ["lint", "type", "py310", "py311", "py312"] +env_list = ["lint", "type", "py310", "py311", "py312", "py313"] # Base testing environment [env_run_base] @@ -9,7 +9,7 @@ deps = [ "pytest-sugar", "pytest-cov", "vcrpy", - "urllib3<2.3.0,>=2.0.0", + "urllib3<2.7.0,>=2.0.0", ] commands = [ [ @@ -68,5 +68,5 @@ commands = [ # Black Configuration [tool.black] line-length = 88 -target-version = ['py310', 'py311', 'py312'] +target-version = ['py310', 'py311', 'py312', 'py313'] exclude = '/(\.git|\.tox|\.venv|_build|dist)/' From 03511b0f09146cbd581d2b84187cdbc267a5dce1 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 19:24:50 +0000 Subject: [PATCH 10/28] Add pylock --- pylock.toml | 442 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 442 insertions(+) create mode 100644 pylock.toml diff --git a/pylock.toml b/pylock.toml new file mode 100644 index 00000000..1e3fb5ec --- /dev/null +++ b/pylock.toml @@ -0,0 +1,442 @@ +lock-version = "1.0" +created-by = "pip" + +[[packages]] +name = "argcomplete" +version = "3.6.3" + +[[packages.wheels]] +name = "argcomplete-3.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/74/f5/9373290775639cb67a2fce7f629a1c240dce9f12fe927bc32b2736e16dfc/argcomplete-3.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f5007b3a600ccac5d25bbce33089211dfd49eab4a7718da3f10e3082525a92ce" + +[[packages]] +name = "build" +version = "1.3.0" + +[[packages.wheels]] +name = "build-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4" + +[[packages]] +name = "cachetools" +version = "6.2.4" + +[[packages.wheels]] +name = "cachetools-6.2.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/fc/1d7b80d0eb7b714984ce40efc78859c022cd930e402f599d8ca9e39c78a4/cachetools-6.2.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "69a7a52634fed8b8bf6e24a050fb60bff1c9bd8f6d24572b99c32d4e71e62a51" + +[[packages]] +name = "certifi" +version = "2025.11.12" + +[[packages.wheels]] +name = "certifi-2025.11.12-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b" + +[[packages]] +name = "cffi" +version = "2.0.0" + +[[packages.wheels]] +name = "cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" +url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" + +[packages.wheels.hashes] +sha256 = "d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b" + +[[packages]] +name = "chardet" +version = "5.2.0" + +[[packages.wheels]] +name = "chardet-5.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" + +[[packages]] +name = "charset-normalizer" +version = "3.4.4" + +[[packages.wheels]] +name = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" +url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + +[packages.wheels.hashes] +sha256 = "6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed" + +[[packages]] +name = "colorama" +version = "0.4.6" + +[[packages.wheels]] +name = "colorama-0.4.6-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + +[[packages]] +name = "coverage" +version = "7.13.0" + +[[packages.wheels]] +name = "coverage-7.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" +url = "https://files.pythonhosted.org/packages/df/61/b5d8105f016e1b5874af0d7c67542da780ccd4a5f2244a433d3e20ceb1ad/coverage-7.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + +[packages.wheels.hashes] +sha256 = "f4f72a85316d8e13234cafe0a9f81b40418ad7a082792fa4165bd7d45d96066b" + +[[packages]] +name = "cryptography" +version = "46.0.3" + +[[packages.wheels]] +name = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl" +url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl" + +[packages.wheels.hashes] +sha256 = "6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb" + +[[packages]] +name = "distlib" +version = "0.4.0" + +[[packages.wheels]] +name = "distlib-0.4.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16" + +[[packages]] +name = "filelock" +version = "3.20.1" + +[[packages.wheels]] +name = "filelock-3.20.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e3/7f/a1a97644e39e7316d850784c642093c99df1290a460df4ede27659056834/filelock-3.20.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a" + +[[packages]] +name = "idna" +version = "3.11" + +[[packages.wheels]] +name = "idna-3.11-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea" + +[[packages]] +name = "iniconfig" +version = "2.3.0" + +[[packages.wheels]] +name = "iniconfig-2.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12" + +[[packages]] +name = "jmespath" +version = "1.0.1" + +[[packages.wheels]] +name = "jmespath-1.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980" + +[[packages]] +name = "msal" +version = "1.32.3" + +[[packages.wheels]] +name = "msal-1.32.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/04/bf/81516b9aac7fd867709984d08eb4db1d2e3fe1df795c8e442cde9b568962/msal-1.32.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b2798db57760b1961b142f027ffb7c8169536bf77316e99a0df5c4aaebb11569" + +[[packages]] +name = "msal-extensions" +version = "1.3.1" + +[[packages.wheels]] +name = "msal_extensions-1.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5e/75/bd9b7bb966668920f06b200e84454c8f3566b102183bc55c5473d96cb2b9/msal_extensions-1.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca" + +[[packages]] +name = "packaging" +version = "25.0" + +[[packages.wheels]] +name = "packaging-25.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484" + +[[packages]] +name = "pip" +version = "25.3" + +[[packages.wheels]] +name = "pip-25.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9655943313a94722b7774661c21049070f6bbb0a1516bf02f7c8d5d9201514cd" + +[[packages]] +name = "platformdirs" +version = "4.5.1" + +[[packages.wheels]] +name = "platformdirs-4.5.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31" + +[[packages]] +name = "pluggy" +version = "1.6.0" + +[[packages.wheels]] +name = "pluggy-1.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" + +[[packages]] +name = "prompt-toolkit" +version = "3.0.52" + +[[packages.wheels]] +name = "prompt_toolkit-3.0.52-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955" + +[[packages]] +name = "psutil" +version = "7.0.0" + +[[packages.wheels]] +name = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" +url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + +[packages.wheels.hashes] +sha256 = "a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993" + +[[packages]] +name = "pycparser" +version = "2.23" + +[[packages.wheels]] +name = "pycparser-2.23-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934" + +[[packages]] +name = "pygments" +version = "2.19.2" + +[[packages.wheels]] +name = "pygments-2.19.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" + +[[packages]] +name = "pyjwt" +version = "2.10.1" + +[[packages.wheels]] +name = "PyJWT-2.10.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb" + +[[packages]] +name = "pyproject-api" +version = "1.10.0" + +[[packages.wheels]] +name = "pyproject_api-1.10.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8757c41a79c0f4ab71b99abed52b97ecf66bd20b04fa59da43b5840bac105a09" + +[[packages]] +name = "pyproject-hooks" +version = "1.2.0" + +[[packages.wheels]] +name = "pyproject_hooks-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913" + +[[packages]] +name = "pytest" +version = "9.0.2" + +[[packages.wheels]] +name = "pytest-9.0.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b" + +[[packages]] +name = "pytest-cov" +version = "7.0.0" + +[[packages.wheels]] +name = "pytest_cov-7.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861" + +[[packages]] +name = "pyyaml" +version = "6.0.3" + +[[packages.wheels]] +name = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" +url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + +[packages.wheels.hashes] +sha256 = "ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c" + +[[packages]] +name = "questionary" +version = "2.1.1" + +[[packages.wheels]] +name = "questionary-2.1.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a51af13f345f1cdea62347589fbb6df3b290306ab8930713bfae4d475a7d4a59" + +[[packages]] +name = "requests" +version = "2.32.5" + +[[packages.wheels]] +name = "requests-2.32.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6" + +[[packages]] +name = "setuptools" +version = "80.9.0" + +[[packages.wheels]] +name = "setuptools-80.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922" + +[[packages]] +name = "tox" +version = "4.32.0" + +[[packages.wheels]] +name = "tox-4.32.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fc/cc/e09c0d663a004945f82beecd4f147053567910479314e8d01ba71e5d5dea/tox-4.32.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "451e81dc02ba8d1ed20efd52ee409641ae4b5d5830e008af10fe8823ef1bd551" + +[[packages]] +name = "urllib3" +version = "2.6.2" + +[[packages.wheels]] +name = "urllib3-2.6.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd" + +[[packages]] +name = "vcrpy" +version = "8.1.0" + +[[packages.wheels]] +name = "vcrpy-8.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/09/77/892bcd82445ac949816205b51ab80deb86a492a315f2e290ed4eab35021c/vcrpy-8.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fc4fb6e954c6d082ba6d329c6f3d1228f5b1b1d2836f9022c301b587cfad7378" + +[[packages]] +name = "virtualenv" +version = "20.35.4" + +[[packages.wheels]] +name = "virtualenv-20.35.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c21c9cede36c9753eeade68ba7d523529f228a403463376cf821eaae2b650f1b" + +[[packages]] +name = "wcwidth" +version = "0.2.14" + +[[packages.wheels]] +name = "wcwidth-0.2.14-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1" + +[[packages]] +name = "wrapt" +version = "2.0.1" + +[[packages.wheels]] +name = "wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" +url = "https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + +[packages.wheels.hashes] +sha256 = "c654eafb01afac55246053d67a4b9a984a3567c3808bb7df2f8de1c1caba2e1c" From f9a4bb2a434fc2f23857477b38cb7d7be416c674 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:31:07 +0000 Subject: [PATCH 11/28] Refactor GITHUB_STEP_SUMMARY messages to use heredoc syntax Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 144 +++++++++++++++------------ 1 file changed, 79 insertions(+), 65 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 4494fd73..fbaa15b3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -24,31 +24,37 @@ jobs: - name: Display workflow information run: | - echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY - echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" else - echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" fi - echo "" >> $GITHUB_STEP_SUMMARY + + cat >> $GITHUB_STEP_SUMMARY << EOF + # 🚀 Create Release Workflow + + ## â„šī¸ Workflow Information + - **Version:** ${{ github.event.inputs.version }} + $TARGET_INFO + + EOF - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY - echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY - echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY - echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Invalid Commit SHA + + The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. + + ### 📝 Troubleshooting + - Verify the commit SHA exists in the repository + - Ensure you are using the full commit SHA (or at least 7 characters) + - Check that the commit is in the current branch history + + EOF echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -84,24 +90,26 @@ jobs: run: | CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" if [ ! -f "$CHANGELOG_FILE" ]; then - echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY - echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY - echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Release Notes File Not Found + + The release notes file was not found at the expected location: + + \`\`\` + $CHANGELOG_FILE + \`\`\` + + ### 📝 What to do: + 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` + 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` + 3. You can use \`changie batch \` to generate the changelog file + + ### 📂 Available changelog files: + \`\`\` + $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") + \`\`\` + + EOF echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi @@ -111,13 +119,15 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## đŸ—ī¸ Creating Release + + Creating release with the following details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` + + EOF # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ @@ -125,31 +135,35 @@ jobs: --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ --target "${{ steps.set_vars.outputs.target_commit }}"; then - echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ✅ Release Created Successfully! + + 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** + + ### 📋 Release Details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) + + EOF else - echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY - echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY - echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY - echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY - echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY - echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Failed to Create Release + + The GitHub CLI failed to create the release. This could be due to: + + ### 🔍 Common Issues: + - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists + - Insufficient permissions to create releases + - Network connectivity issues + - Invalid release notes format + + ### 📝 Next Steps: + 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` + 2. Verify you have the necessary permissions to create releases + 3. Review the workflow run logs for detailed error messages + + EOF echo "Error: Failed to create release" exit 1 fi From 71b87c6755aa77e43a9cf3796b6f15b254fcf557 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Mon, 22 Dec 2025 10:36:58 +0000 Subject: [PATCH 12/28] Update msal[broker] --- pyproject.toml | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index accdaded..ee6a6013 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ classifiers = [ ] dependencies = [ - "msal[broker]>=1.29,<2", + "msal[broker]>=1.31,<2", "msal_extensions", "questionary", "prompt_toolkit>=3.0.41", diff --git a/requirements.txt b/requirements.txt index d4aa02b7..7348357c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ prompt_toolkit requests cryptography questionary -msal[broker]>=1.29,<2 +msal[broker]>=1.31,<2 msal_extensions PyYAML jmespath From 35e8e09fce4cf997b860da9eb69acc5787bb0ee1 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Mon, 22 Dec 2025 10:37:14 +0000 Subject: [PATCH 13/28] Update gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 17d1911d..1fc5ba85 100644 --- a/.gitignore +++ b/.gitignore @@ -208,3 +208,5 @@ cython_debug/ marimo/_static/ marimo/_lsp/ __marimo__/ + +devcontainer.local.json From 641c4e768f65e6e348b1897e352bd4f0cbc39bae Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 14/28] Update release notes for v1.3.1 --- docs/release-notes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 479c7cb5..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions @@ -165,4 +165,4 @@ hide: * Initial public release * Released to PyPI -* Onboarded to GitHub Pages \ No newline at end of file +* Onboarded to GitHub Pages From ee3dc89127ec0ef2f6b8d1b2388756b20736dd33 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:50:29 +0200 Subject: [PATCH 15/28] Delete python313support.md --- python313support.md | 445 -------------------------------------------- 1 file changed, 445 deletions(-) delete mode 100644 python313support.md diff --git a/python313support.md b/python313support.md deleted file mode 100644 index 7cb44d62..00000000 --- a/python313support.md +++ /dev/null @@ -1,445 +0,0 @@ -# Python 3.13 Support Specification - -## Overview - -This specification outlines the requirements and implementation plan for adding Python 3.13 support to the Microsoft Fabric CLI, in addition to the currently supported versions (3.10, 3.11, and 3.12). - -## Background - -### Current State -- **Supported Python Versions**: 3.10, 3.11, 3.12 -- **Blocking Dependency**: `msal[broker]` which depends on `pymsalruntime` -- **Historical Issue**: `pymsalruntime` lacked Python 3.13 support until recently - -### Recent Development -- **pymsalruntime 0.18.1** (released in late 2024) officially added Python 3.13 support -- This removes the primary blocker for Fabric CLI Python 3.13 compatibility - -## Goals - -1. **Add Python 3.13 as a supported version** for the Fabric CLI -2. **Maintain backward compatibility** with Python 3.10, 3.11, and 3.12 -3. **Update all configuration and CI/CD pipelines** to test against Python 3.13 -4. **Ensure all dependencies are compatible** with Python 3.13 -5. **Update documentation** to reflect the new supported version - -## Technical Assessment - -### Dependency Analysis - -#### Critical Dependencies -| Dependency | Current Constraint | Python 3.13 Status | Action Required | -|------------|-------------------|-------------------|-----------------| -| `msal[broker]` | `>=1.29,<2` | ✅ Supported via pymsalruntime 0.18.1+ | Verify minimum version | -| `msal_extensions` | No version constraint | ✅ Compatible | None | -| `questionary` | No version constraint | ✅ Compatible | None | -| `prompt_toolkit` | `>=3.0.41` | ✅ Compatible | None | -| `cachetools` | `>=5.5.0` | ✅ Compatible | None | -| `jmespath` | No version constraint | ✅ Compatible | None | -| `pyyaml` | `==6.0.2` | ✅ Compatible | None | -| `argcomplete` | `>=3.6.2` | ✅ Compatible | None | -| `psutil` | `==7.0.0` | ✅ Compatible (3.13 wheels available) | None | - -#### Test Dependencies -| Dependency | Current Constraint | Python 3.13 Status | Notes | -|------------|-------------------|-------------------|-------| -| `pytest` | `>=8.2.1` | ✅ Compatible | - | -| `pytest-cov` | No version constraint | ✅ Compatible | - | -| `vcrpy` | No version constraint | ✅ Compatible | - | -| `urllib3` | `<2.3.0,>=2.0.0` | ✅ Compatible | See urllib3 analysis below | - -#### Development Dependencies -| Dependency | Python 3.13 Status | -|------------|-------------------| -| `black` | ✅ Compatible | -| `mypy` | ✅ Compatible | -| `tox` | ✅ Compatible (>=4.20.0) | - -#### urllib3 Version Analysis - -**Current Constraint**: `urllib3<2.3.0,>=2.0.0` -**Proposed Update**: `urllib3<2.7.0,>=2.0.0` - -**Context**: -- urllib3 is used as a **test dependency only** (in `requirements.txt` and `tox.toml`) -- Not listed in `pyproject.toml` runtime dependencies -- Used indirectly via `requests` library (which depends on urllib3) -- Direct import found only in test code: [`tests/test_commands/api_processors/capacities_api_processor.py`](../../tests/test_commands/api_processors/capacities_api_processor.py:7) - -**urllib3 Version Compatibility**: -| Version | Python 3.13 Support | Status | Notes | -|---------|-------------------|--------|-------| -| 2.2.x | ✅ Full support | Current in use (per NOTICE.txt: 2.2.3) | Stable | -| 2.3.x - 2.6.x | ✅ Full support | Available | Includes security fixes | -| 2.7.x | ✅ Full support | Latest (as of Dec 2024) | Python 3.13 wheels available | - -**Requests Library Compatibility**: -- `requests` 2.32.5 (current version per NOTICE.txt) supports urllib3 v2.x -- No upper bound specified in requests for urllib3 2.x series -- requests pins: `urllib3>=1.21.1,<3` - -**Benefits of Updating to <2.7.0**: -1. ✅ **Security patches**: Access to latest security fixes in urllib3 2.3.x - 2.6.x -2. ✅ **Python 3.13 optimization**: Better support for Python 3.13 features -3. ✅ **Future-proof**: Extends compatibility window -4. ✅ **Bug fixes**: Access to bug fixes in newer versions -5. ✅ **Backwards compatible**: urllib3 2.x maintains API compatibility - -**Risk Assessment**: -- **Risk Level**: âš ī¸ **Low-Medium** -- **Primary Concern**: urllib3 2.3+ introduced some behavioral changes -- **Mitigation**: Comprehensive testing required - -**Breaking Changes in urllib3 2.3+**: -- urllib3 2.3.0+ removed support for Python 3.7 -- Some deprecated APIs removed (but Fabric CLI doesn't use deprecated features) -- Minor changes to SSL/TLS handling (unlikely to affect CLI) - -**Testing Required**: -1. ✅ Test suite passes with urllib3 2.6.x -2. ✅ VCR cassette playback works correctly -3. ✅ API processor tests function properly (especially `capacities_api_processor.py`) -4. ✅ No breaking changes in test utilities - -**Recommendation**: ✅ **Proceed with Update** - -The update to `urllib3<2.7.0` is recommended for: -- Enhanced Python 3.13 compatibility -- Access to security patches -- Alignment with modern dependency practices - -However, this should be tested thoroughly as part of the Python 3.13 support implementation. - -### Code Compatibility Analysis - -Based on the codebase scan: - -#### Typing Module Usage -- **Finding**: Extensive use of `typing` module (74 occurrences) -- **Status**: ✅ All typing constructs used (`Optional`, `List`, `Dict`, `Any`, `Union`, `Literal`, `NamedTuple`) are compatible with Python 3.13 -- **Action**: None required - -#### Language Features -- **No Python 3.13-incompatible features detected** -- **Standard library usage**: All imports use stable APIs -- **No deprecated features**: Code doesn't rely on features removed in 3.13 - -#### Potential Considerations -1. **Type hints**: Python 3.13 continues to support all type hint syntax used in the codebase -2. **MSAL broker authentication**: Relies on `pymsalruntime` - now supported -3. **String encoding**: No issues detected with f-strings or string operations -4. **Exception handling**: Uses standard patterns compatible with 3.13 - -## Implementation Plan - -### Phase 1: Configuration Updates - -#### 1.1 Update pyproject.toml -**File**: [`pyproject.toml`](../../pyproject.toml) - -**Changes Required**: -```toml -# Line 13: Update Python version constraint -requires-python=">=3.10,<3.14" - -# Lines 15-20: Add Python 3.13 classifier -classifiers = [ - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Operating System :: OS Independent", -] -``` - -**Risk**: Low - straightforward version constraint update - -#### 1.2 Update tox.toml -**File**: [`tox.toml`](../../tox.toml) - -**Changes Required**: -```toml -# Line 2: Add py313 to test environment list -env_list = ["lint", "type", "py310", "py311", "py312", "py313"] - -# Line 71: Add py313 to Black target versions -target-version = ['py310', 'py311', 'py312', 'py313'] -``` - -**Risk**: Low - extends existing test matrix - -### Phase 2: CI/CD Pipeline Updates - -#### 2.1 Update GitHub Actions Workflow -**File**: [`.github/workflows/fab-build.yml`](../../.github/workflows/fab-build.yml) - -**Changes Required**: -```yaml -# Lines 74-81: Add Python 3.13 to test matrix -strategy: - matrix: - include: - - python-version: "3.10" - tox-env: "py310" - - python-version: "3.11" - tox-env: "py311" - - python-version: "3.12" - tox-env: "py312" - - python-version: "3.13" - tox-env: "py313" -``` - -**Risk**: Low - extends existing matrix strategy - -#### 2.2 Update Dev Container (Optional) -**File**: [`.devcontainer/devcontainer.json`](../../.devcontainer/devcontainer.json) - -**Current**: Uses Python 3.10 base image -**Recommendation**: Keep current version or update to 3.12+ as it supports development for all versions -**Risk**: Low - optional update, current container works for development - -### Phase 3: Documentation Updates - -#### 3.1 Update README.md -**File**: [`README.md`](../../README.md) - -**Changes Required**: -```markdown -# Line 59: Update prerequisites -- **Python 3.10, 3.11, 3.12, or 3.13** -``` - -**Risk**: None - documentation only - -#### 3.2 Update Example Files -**File**: [`docs/examples/files/github-workflow.yml`](../examples/files/github-workflow.yml) - -**Changes Required** (Optional): -```yaml -# Line 27: Consider updating example to use 3.13 -python-version: "3.13" -``` - -**Risk**: None - example file only, can keep as 3.12 for stability - -### Phase 4: Dependency Verification - -#### 4.1 Verify pymsalruntime Minimum Version -**Recommended Action**: Test that `msal[broker]>=1.29` properly installs pymsalruntime 0.18.1+ on Python 3.13 - -**Verification Steps**: -```bash -# In Python 3.13 environment -pip install "msal[broker]>=1.29,<2" -python -c "import pymsalruntime; print(pymsalruntime.__version__)" -# Should be >= 0.18.1 -``` - -**Risk**: Medium - if older pymsalruntime is installed, broker authentication may fail - -**Mitigation**: Consider adding explicit minimum version constraint if needed: -```toml -# In pyproject.toml dependencies (if required) -"msal[broker]>=1.31,<2", -``` - -#### 4.2 Update urllib3 Version Constraint -**Files to Update**: -- [`requirements.txt`](../../requirements.txt:4) -- [`tox.toml`](../../tox.toml:12) - -**Current**: `urllib3<2.3.0,>=2.0.0` -**Proposed**: `urllib3<2.7.0,>=2.0.0` - -**Changes Required**: - -**requirements.txt**: -```txt -urllib3<2.7.0,>=2.0.0 -``` - -**tox.toml**: -```toml -deps = [ - "pytest>=8", - "pytest-sugar", - "pytest-cov", - "vcrpy", - "urllib3<2.7.0,>=2.0.0", -] -``` - -**Verification Steps**: -```bash -# Test with updated urllib3 -pip install "urllib3<2.7.0,>=2.0.0" -python -c "import urllib3; print(urllib3.__version__)" -# Should be >= 2.0.0 and < 2.7.0 - -# Run test suite -tox -e py313 -# All tests should pass -``` - -**Risk**: Low-Medium - urllib3 is test-only dependency with good backwards compatibility - -**Testing Focus**: -- VCR cassette playback in tests -- API processor functionality -- No regression in existing test suites - -### Phase 5: Testing & Validation - -#### 5.1 Local Testing -**Test Matrix**: -- ✅ Unit tests on Python 3.13 -- ✅ Integration tests on Python 3.13 -- ✅ Type checking on Python 3.13 -- ✅ Linting on Python 3.13 -- ✅ Build package on Python 3.13 - -#### 5.2 Feature Testing -**Critical Features to Test on Python 3.13**: -1. **Authentication**: - - Interactive login with broker - - Service principal authentication - - Managed identity authentication - - Federated token authentication - -2. **File System Operations**: - - `ls`, `cd`, `pwd`, `mkdir`, `rm` - - OneLake file operations - - Import/export - -3. **API Operations**: - - REST API calls - - JMESPath filtering - -4. **Job Management**: - - Job execution - - Status polling - -#### 5.3 Cross-Version Compatibility Testing -**Verify**: -- Code works on all versions (3.10, 3.11, 3.12, 3.13) -- No regressions in existing versions -- Consistent behavior across versions - -## Risk Assessment - -### Low Risk Items -- ✅ Configuration file updates -- ✅ Documentation updates -- ✅ CI/CD pipeline extensions -- ✅ Standard library compatibility - -### Medium Risk Items -- âš ī¸ **pymsalruntime version verification**: Need to confirm msal[broker] pulls correct version -- âš ī¸ **Broker authentication on 3.13**: Primary use case for pymsalruntime dependency - -### Mitigation Strategies - -1. **Phased Rollout**: - - Add 3.13 support in pre-release - - Gather community feedback - - Monitor for issues before stable release - -2. **Comprehensive Testing**: - - Run full test suite on Python 3.13 - - Manual testing of broker authentication - - Verify on multiple platforms (Windows, macOS, Linux) - -3. **Documentation**: - - Clearly communicate 3.13 as newly supported - - Note any platform-specific considerations - - Provide troubleshooting guidance - -## Implementation Checklist - -### Pre-Implementation -- [ ] Create GitHub issue for Python 3.13 support -- [ ] Verify pymsalruntime 0.18.1+ availability on PyPI -- [ ] Test msal[broker] installation on Python 3.13 environment - -### Core Implementation -- [ ] Update [`pyproject.toml`](../../pyproject.toml) (version constraint + classifiers) -- [ ] Update [`tox.toml`](../../tox.toml) (test environments + urllib3 version) -- [ ] Update [`.github/workflows/fab-build.yml`](../../.github/workflows/fab-build.yml) (CI matrix) -- [ ] Update [`README.md`](../../README.md) (prerequisites) -- [ ] Update [`requirements.txt`](../../requirements.txt) (urllib3 version) - -### Testing -- [ ] Run `tox -e py313` locally -- [ ] Verify all unit tests pass -- [ ] Verify all integration tests pass -- [ ] Test broker authentication on Python 3.13 -- [ ] Test urllib3 2.6.x compatibility with VCR cassettes -- [ ] Test API processor functionality with updated urllib3 -- [ ] Test on Windows with Python 3.13 -- [ ] Test on macOS with Python 3.13 -- [ ] Test on Linux with Python 3.13 - -### Documentation -- [ ] Update installation documentation -- [ ] Update contributing guide if needed -- [ ] Add Python 3.13 to supported versions in all docs -- [ ] Create changelog entry using `changie new` - -### Release -- [ ] Create pull request with all changes -- [ ] Run full CI/CD pipeline -- [ ] Review and approve PR -- [ ] Merge to main -- [ ] Create release with updated PyPI package -- [ ] Announce Python 3.13 support - -## Timeline Estimate - -| Phase | Estimated Time | Dependencies | -|-------|---------------|--------------| -| Configuration Updates | 1-2 hours | None | -| CI/CD Updates | 1-2 hours | Configuration complete | -| urllib3 Update & Testing | 2-3 hours | Configuration complete | -| Documentation | 1 hour | None | -| Testing & Validation | 4-8 hours | All updates complete | -| PR Review & Merge | 1-2 days | Testing complete | -| **Total** | **2-3 days** | - | - -## Success Criteria - -1. ✅ Python 3.13 listed as supported version in PyPI -2. ✅ All CI/CD tests pass on Python 3.13 -3. ✅ Package installs successfully via `pip install ms-fabric-cli` on Python 3.13 -4. ✅ All authentication methods work on Python 3.13 -5. ✅ No regressions in Python 3.10, 3.11, or 3.12 -6. ✅ Documentation updated across all relevant files - -## Post-Implementation - -### Monitoring -- Monitor GitHub issues for Python 3.13-specific problems -- Track PyPI download statistics by Python version -- Gather community feedback on 3.13 compatibility - -### Future Considerations -- **Python 3.14**: Begin planning when Python 3.14 enters beta -- **Deprecation**: Consider Python 3.10 deprecation timeline (follow Python EOL dates) -- **Type System**: Leverage newer Python 3.13 type system features in future updates - -## References - -- [Python 3.13 Release Notes](https://docs.python.org/3.13/whatsnew/3.13.html) -- [pymsalruntime 0.18.1 Release](https://pypi.org/project/pymsalruntime/0.18.1/) -- [msal-python GitHub](https://github.com/AzureAD/microsoft-authentication-library-for-python) -- [Python Packaging User Guide](https://packaging.python.org/) - -## Conclusion - -Adding Python 3.13 support to the Fabric CLI is a **low-risk, high-value enhancement** that: -- Keeps the CLI current with the latest Python releases -- Enables users on Python 3.13 to use the tool -- Demonstrates active maintenance and community support -- Requires minimal code changes due to careful dependency management - -The primary blocker (`pymsalruntime`) has been resolved, and no breaking changes in Python 3.13 affect the current codebase. Implementation can proceed with confidence following the outlined plan. From 516dbb8cb5dcbbcb1f76372ec9f1236498a10fcf Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Sun, 14 Dec 2025 14:12:48 +0000 Subject: [PATCH 16/28] Fix new functionality section in release notes --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index dc41a2b2..056089bc 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of mv, cp, export and import for SQLDatabase item type +* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From 484993f8291512a108bed94c975fc2bab2647399 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Wed, 17 Dec 2025 13:43:53 +0000 Subject: [PATCH 17/28] Introduce release workflow --- .github/workflows/create-release.yml | 140 +-------------------------- 1 file changed, 4 insertions(+), 136 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index fbaa15b3..819cd8cf 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,10 +6,6 @@ on: version: description: 'The version to release (e.g., v1.2.0)' required: true - commit_sha: - description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' - required: false - default: '' jobs: create-release: @@ -19,151 +15,23 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - with: - fetch-depth: 0 # Required to access full commit history for validation - - - name: Display workflow information - run: | - if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" - else - TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" - fi - - cat >> $GITHUB_STEP_SUMMARY << EOF - # 🚀 Create Release Workflow - - ## â„šī¸ Workflow Information - - **Version:** ${{ github.event.inputs.version }} - $TARGET_INFO - - EOF - - - name: Validate commit SHA (if provided) - if: ${{ github.event.inputs.commit_sha != '' }} - run: | - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Invalid Commit SHA - - The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. - - ### 📝 Troubleshooting - - Verify the commit SHA exists in the repository - - Ensure you are using the full commit SHA (or at least 7 characters) - - Check that the commit is in the current branch history - - EOF - echo "Error: Invalid commit SHA: $COMMIT_SHA" - exit 1 - fi - echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" - COMMIT_SHA="${{ github.event.inputs.commit_sha }}" - - # Use provided commit SHA or default to HEAD - if [ -n "$COMMIT_SHA" ]; then - TARGET_COMMIT="$COMMIT_SHA" - else - TARGET_COMMIT="HEAD" - fi - echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT - echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT - - # Get the actual commit SHA for display - ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") - echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT - - echo "✅ Release variables set:" - echo " - Tag name: $VERSION" - echo " - Target commit: $ACTUAL_SHA" - echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" - if [ ! -f "$CHANGELOG_FILE" ]; then - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Release Notes File Not Found - - The release notes file was not found at the expected location: - - \`\`\` - $CHANGELOG_FILE - \`\`\` - - ### 📝 What to do: - 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` - 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` - 3. You can use \`changie batch \` to generate the changelog file - - ### 📂 Available changelog files: - \`\`\` - $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") - \`\`\` - - EOF - echo "Error: Release notes file not found at $CHANGELOG_FILE" + if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then + echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" exit 1 fi - echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI - env: - GH_TOKEN: ${{ github.token }} run: | - cat >> $GITHUB_STEP_SUMMARY << EOF - ## đŸ—ī¸ Creating Release - - Creating release with the following details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` - - EOF - - # Create the release with the target commit - if gh release create ${{ steps.set_vars.outputs.tag_name }} \ + gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ - --target "${{ steps.set_vars.outputs.target_commit }}"; then - - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ✅ Release Created Successfully! - - 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** - - ### 📋 Release Details: - - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` - - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` - - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) - - EOF - else - cat >> $GITHUB_STEP_SUMMARY << EOF - ## ❌ Error: Failed to Create Release - - The GitHub CLI failed to create the release. This could be due to: - - ### 🔍 Common Issues: - - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists - - Insufficient permissions to create releases - - Network connectivity issues - - Invalid release notes format - - ### 📝 Next Steps: - 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` - 2. Verify you have the necessary permissions to create releases - 3. Review the workflow run logs for detailed error messages - - EOF - echo "Error: Failed to create release" - exit 1 - fi + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file From 3a42a5cc88c1846bc164ea73a3e43a2a7549f4f1 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:21:05 +0200 Subject: [PATCH 18/28] Add GH_TOKEN to create release step --- .github/workflows/create-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 819cd8cf..e8dd7f15 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -31,7 +31,9 @@ jobs: fi - name: Create Release with GitHub CLI + env: + GH_TOKEN: ${{ github.token }} run: | gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ No newline at end of file + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" From 0755733cee4f5bf85a6ef9533c5e44caaeb49a0e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:29:08 +0000 Subject: [PATCH 19/28] Initial plan From 5917da7c91f018d0fedbacfe5d889e8651318d53 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:33:51 +0000 Subject: [PATCH 20/28] Enhance create-release workflow with GITHUB_STEP_SUMMARY and optional commit SHA Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 124 ++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index e8dd7f15..4494fd73 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -6,6 +6,10 @@ on: version: description: 'The version to release (e.g., v1.2.0)' required: true + commit_sha: + description: 'Optional: Commit SHA to create the tag on. If not provided, the tag will be created on the latest commit of the current branch (HEAD)' + required: false + default: '' jobs: create-release: @@ -15,25 +19,137 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 # Required to access full commit history for validation + + - name: Display workflow information + run: | + echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY + echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY + if [ -n "${{ github.event.inputs.commit_sha }}" ]; then + echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + else + echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + fi + echo "" >> $GITHUB_STEP_SUMMARY + + - name: Validate commit SHA (if provided) + if: ${{ github.event.inputs.commit_sha != '' }} + run: | + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then + echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY + echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY + echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY + echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Invalid commit SHA: $COMMIT_SHA" + exit 1 + fi + echo "✅ Commit SHA validated successfully: $COMMIT_SHA" - name: Set up release variables id: set_vars run: | VERSION="${{ github.event.inputs.version }}" + COMMIT_SHA="${{ github.event.inputs.commit_sha }}" + + # Use provided commit SHA or default to HEAD + if [ -n "$COMMIT_SHA" ]; then + TARGET_COMMIT="$COMMIT_SHA" + else + TARGET_COMMIT="HEAD" + fi + echo "tag_name=$VERSION" >> $GITHUB_OUTPUT echo "changelog_file_path=.changes/${VERSION}.md" >> $GITHUB_OUTPUT + echo "target_commit=$TARGET_COMMIT" >> $GITHUB_OUTPUT + + # Get the actual commit SHA for display + ACTUAL_SHA=$(git rev-parse "$TARGET_COMMIT") + echo "actual_sha=$ACTUAL_SHA" >> $GITHUB_OUTPUT + + echo "✅ Release variables set:" + echo " - Tag name: $VERSION" + echo " - Target commit: $ACTUAL_SHA" + echo " - Changelog file: .changes/${VERSION}.md" - name: Validate release notes file run: | - if [ ! -f "${{ steps.set_vars.outputs.changelog_file_path }}" ]; then - echo "Error: Release notes file not found at ${{ steps.set_vars.outputs.changelog_file_path }}" + CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" + if [ ! -f "$CHANGELOG_FILE" ]; then + echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY + echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY + echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi + echo "✅ Release notes file found at: $CHANGELOG_FILE" - name: Create Release with GitHub CLI env: GH_TOKEN: ${{ github.token }} run: | - gh release create ${{ steps.set_vars.outputs.tag_name }} \ + echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Create the release with the target commit + if gh release create ${{ steps.set_vars.outputs.tag_name }} \ --title "${{ steps.set_vars.outputs.tag_name }}" \ - --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" + --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ + --target "${{ steps.set_vars.outputs.target_commit }}"; then + + echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY + echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY + echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY + echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY + echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY + echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY + echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY + echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "Error: Failed to create release" + exit 1 + fi From 635eadc107fdd33d7d22239951eab46eef0f3b66 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:31:07 +0000 Subject: [PATCH 21/28] Refactor GITHUB_STEP_SUMMARY messages to use heredoc syntax Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com> --- .github/workflows/create-release.yml | 144 +++++++++++++++------------ 1 file changed, 79 insertions(+), 65 deletions(-) diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 4494fd73..fbaa15b3 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -24,31 +24,37 @@ jobs: - name: Display workflow information run: | - echo "# 🚀 Create Release Workflow" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## â„šī¸ Workflow Information" >> $GITHUB_STEP_SUMMARY - echo "- **Version:** ${{ github.event.inputs.version }}" >> $GITHUB_STEP_SUMMARY if [ -n "${{ github.event.inputs.commit_sha }}" ]; then - echo "- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** \`${{ github.event.inputs.commit_sha }}\`" else - echo "- **Target Commit:** Latest commit on current branch (HEAD)" >> $GITHUB_STEP_SUMMARY + TARGET_INFO="- **Target Commit:** Latest commit on current branch (HEAD)" fi - echo "" >> $GITHUB_STEP_SUMMARY + + cat >> $GITHUB_STEP_SUMMARY << EOF + # 🚀 Create Release Workflow + + ## â„šī¸ Workflow Information + - **Version:** ${{ github.event.inputs.version }} + $TARGET_INFO + + EOF - name: Validate commit SHA (if provided) if: ${{ github.event.inputs.commit_sha != '' }} run: | COMMIT_SHA="${{ github.event.inputs.commit_sha }}" if ! git rev-parse --verify "$COMMIT_SHA^{commit}" >/dev/null 2>&1; then - echo "## ❌ Error: Invalid Commit SHA" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Troubleshooting" >> $GITHUB_STEP_SUMMARY - echo "- Verify the commit SHA exists in the repository" >> $GITHUB_STEP_SUMMARY - echo "- Ensure you are using the full commit SHA (or at least 7 characters)" >> $GITHUB_STEP_SUMMARY - echo "- Check that the commit is in the current branch history" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Invalid Commit SHA + + The provided commit SHA \`$COMMIT_SHA\` is not valid or does not exist in this repository. + + ### 📝 Troubleshooting + - Verify the commit SHA exists in the repository + - Ensure you are using the full commit SHA (or at least 7 characters) + - Check that the commit is in the current branch history + + EOF echo "Error: Invalid commit SHA: $COMMIT_SHA" exit 1 fi @@ -84,24 +90,26 @@ jobs: run: | CHANGELOG_FILE="${{ steps.set_vars.outputs.changelog_file_path }}" if [ ! -f "$CHANGELOG_FILE" ]; then - echo "## ❌ Error: Release Notes File Not Found" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The release notes file was not found at the expected location:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "$CHANGELOG_FILE" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 What to do:" >> $GITHUB_STEP_SUMMARY - echo "1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\`" >> $GITHUB_STEP_SUMMARY - echo "3. You can use \`changie batch \` to generate the changelog file" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📂 Available changelog files:" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found" >> $GITHUB_STEP_SUMMARY - echo "\`\`\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Release Notes File Not Found + + The release notes file was not found at the expected location: + + \`\`\` + $CHANGELOG_FILE + \`\`\` + + ### 📝 What to do: + 1. Ensure you have created the changelog file for version \`${{ steps.set_vars.outputs.tag_name }}\` + 2. The file should be located at: \`.changes/${{ steps.set_vars.outputs.tag_name }}.md\` + 3. You can use \`changie batch \` to generate the changelog file + + ### 📂 Available changelog files: + \`\`\` + $(ls -1 .changes/*.md 2>/dev/null || echo "No changelog files found") + \`\`\` + + EOF echo "Error: Release notes file not found at $CHANGELOG_FILE" exit 1 fi @@ -111,13 +119,15 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - echo "## đŸ—ī¸ Creating Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Creating release with the following details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\`" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## đŸ—ī¸ Creating Release + + Creating release with the following details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Target Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Notes File:** \`${{ steps.set_vars.outputs.changelog_file_path }}\` + + EOF # Create the release with the target commit if gh release create ${{ steps.set_vars.outputs.tag_name }} \ @@ -125,31 +135,35 @@ jobs: --notes-file "${{ steps.set_vars.outputs.changelog_file_path }}" \ --target "${{ steps.set_vars.outputs.target_commit }}"; then - echo "## ✅ Release Created Successfully!" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!**" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📋 Release Details:" >> $GITHUB_STEP_SUMMARY - echo "- **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\`" >> $GITHUB_STEP_SUMMARY - echo "- **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }})" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ✅ Release Created Successfully! + + 🎉 **Release \`${{ steps.set_vars.outputs.tag_name }}\` has been created!** + + ### 📋 Release Details: + - **Tag:** \`${{ steps.set_vars.outputs.tag_name }}\` + - **Commit:** \`${{ steps.set_vars.outputs.actual_sha }}\` + - **Release URL:** [View Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.set_vars.outputs.tag_name }}) + + EOF else - echo "## ❌ Error: Failed to Create Release" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "The GitHub CLI failed to create the release. This could be due to:" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 🔍 Common Issues:" >> $GITHUB_STEP_SUMMARY - echo "- A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists" >> $GITHUB_STEP_SUMMARY - echo "- Insufficient permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "- Network connectivity issues" >> $GITHUB_STEP_SUMMARY - echo "- Invalid release notes format" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### 📝 Next Steps:" >> $GITHUB_STEP_SUMMARY - echo "1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\`" >> $GITHUB_STEP_SUMMARY - echo "2. Verify you have the necessary permissions to create releases" >> $GITHUB_STEP_SUMMARY - echo "3. Review the workflow run logs for detailed error messages" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY + cat >> $GITHUB_STEP_SUMMARY << EOF + ## ❌ Error: Failed to Create Release + + The GitHub CLI failed to create the release. This could be due to: + + ### 🔍 Common Issues: + - A release with tag \`${{ steps.set_vars.outputs.tag_name }}\` already exists + - Insufficient permissions to create releases + - Network connectivity issues + - Invalid release notes format + + ### 📝 Next Steps: + 1. Check if the tag already exists: \`git tag -l '${{ steps.set_vars.outputs.tag_name }}'\` + 2. Verify you have the necessary permissions to create releases + 3. Review the workflow run logs for detailed error messages + + EOF echo "Error: Failed to create release" exit 1 fi From 22cc9cb859a54276701237c8a19c5afaafd93f81 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Mon, 22 Dec 2025 12:48:32 +0200 Subject: [PATCH 22/28] Update release notes for v1.3.1 --- docs/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index 056089bc..dc41a2b2 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -10,7 +10,7 @@ hide: ### ✨ New Functionality -* Add support of `mv`, `cp` and `import` commands for SQLDatabase item type +* Add support of mv, cp, export and import for SQLDatabase item type * Add new 'job run-rm' command for remove a scheduled job * Enhance `set` command for items to support any settable property path within the item's definition and metadata structure * Add support in `ls` commmand using `-q` flag for filtering based on JMESPath expressions From d82274345e05187ce81585e38cd81dba6234dee2 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Thu, 1 Jan 2026 13:28:57 +0000 Subject: [PATCH 23/28] Update lock file --- pylock.toml | 71 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 19 deletions(-) diff --git a/pylock.toml b/pylock.toml index 1e3fb5ec..5989f08d 100644 --- a/pylock.toml +++ b/pylock.toml @@ -50,11 +50,11 @@ name = "cffi" version = "2.0.0" [[packages.wheels]] -name = "cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" -url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" +name = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" +url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" [packages.wheels.hashes] -sha256 = "d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b" +sha256 = "3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb" [[packages]] name = "chardet" @@ -72,11 +72,11 @@ name = "charset-normalizer" version = "3.4.4" [[packages.wheels]] -name = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" -url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" +name = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" +url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" [packages.wheels.hashes] -sha256 = "6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed" +sha256 = "4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8" [[packages]] name = "colorama" @@ -91,25 +91,25 @@ sha256 = "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" [[packages]] name = "coverage" -version = "7.13.0" +version = "7.13.1" [[packages.wheels]] -name = "coverage-7.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" -url = "https://files.pythonhosted.org/packages/df/61/b5d8105f016e1b5874af0d7c67542da780ccd4a5f2244a433d3e20ceb1ad/coverage-7.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" +name = "coverage-7.13.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" +url = "https://files.pythonhosted.org/packages/da/bf/6e8056a83fd7a96c93341f1ffe10df636dd89f26d5e7b9ca511ce3bcf0df/coverage-7.13.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" [packages.wheels.hashes] -sha256 = "f4f72a85316d8e13234cafe0a9f81b40418ad7a082792fa4165bd7d45d96066b" +sha256 = "d1443ba9acbb593fa7c1c29e011d7c9761545fe35e7652e85ce7f51a16f7e08d" [[packages]] name = "cryptography" version = "46.0.3" [[packages.wheels]] -name = "cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl" -url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl" +name = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl" +url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl" [packages.wheels.hashes] -sha256 = "6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb" +sha256 = "46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0" [[packages]] name = "distlib" @@ -122,6 +122,17 @@ url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072f [packages.wheels.hashes] sha256 = "9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16" +[[packages]] +name = "exceptiongroup" +version = "1.3.1" + +[[packages.wheels]] +name = "exceptiongroup-1.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598" + [[packages]] name = "filelock" version = "3.20.1" @@ -336,11 +347,11 @@ name = "pyyaml" version = "6.0.3" [[packages.wheels]] -name = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" -url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" +name = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" +url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" [packages.wheels.hashes] -sha256 = "ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c" +sha256 = "b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8" [[packages]] name = "questionary" @@ -375,6 +386,17 @@ url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a8 [packages.wheels.hashes] sha256 = "062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922" +[[packages]] +name = "tomli" +version = "2.3.0" + +[[packages.wheels]] +name = "tomli-2.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b" + [[packages]] name = "tox" version = "4.32.0" @@ -386,6 +408,17 @@ url = "https://files.pythonhosted.org/packages/fc/cc/e09c0d663a004945f82beecd4f1 [packages.wheels.hashes] sha256 = "451e81dc02ba8d1ed20efd52ee409641ae4b5d5830e008af10fe8823ef1bd551" +[[packages]] +name = "typing-extensions" +version = "4.15.0" + +[[packages.wheels]] +name = "typing_extensions-4.15.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" + [[packages]] name = "urllib3" version = "2.6.2" @@ -435,8 +468,8 @@ name = "wrapt" version = "2.0.1" [[packages.wheels]] -name = "wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" -url = "https://files.pythonhosted.org/packages/0f/6b/806dbf6dd9579556aab22fc92908a876636e250f063f71548a8660382184/wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" +name = "wrapt-2.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" +url = "https://files.pythonhosted.org/packages/a0/0a/e38fc0cee1f146c9fb266d8ef96ca39fb14a9eef165383004019aa53f88a/wrapt-2.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" [packages.wheels.hashes] -sha256 = "c654eafb01afac55246053d67a4b9a984a3567c3808bb7df2f8de1c1caba2e1c" +sha256 = "23097ed8bc4c93b7bf36fa2113c6c733c976316ce0ee2c816f64ca06102034ef" From 79ba2668795e2f5201d2aaf5b877c2fc4887d4a0 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun <98805507+ayeshurun@users.noreply.github.com> Date: Tue, 6 Jan 2026 09:57:41 +0200 Subject: [PATCH 24/28] Update Python version support to include 3.13 --- .github/copilot-instructions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index adc080f2..8d370edd 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -15,7 +15,7 @@ This file gives AI coding assistants the **ground truth** for this repository: w ## High-level architecture & code layout -- **Language & framework:** Python 3.10-3.12 with `argparse` for command parsing. When adding commands, define prompts under the appropriate parser module and follow the parser conventions. +- **Language & framework:** Python 3.10-3.13 with `argparse` for command parsing. When adding commands, define prompts under the appropriate parser module and follow the parser conventions. - **Representative paths in the codebase:** - Commands: `src/fabric_cli/commands/...` - Core utils/UI: `src/fabric_cli/utils/...` @@ -147,7 +147,7 @@ fab get ws1.Workspace/.sparkpools/.SparkPool ## Limitations -- Python supported version are 3.10, 3.11 and 3.12 (>=3.13 not supported per releases). +- Python supported version are 3.10, 3.11, 3.12 and 3.13 (>3.13 not supported per releases). - Supported platforms are: Windows, Linux and MacOS. - Supported shells are: zsh, bash, PowerShell and cmd (command prompt in Windows). From 92cd8f83cc950c036a7d86bb200e794682bc9ef8 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Tue, 6 Jan 2026 15:46:05 +0200 Subject: [PATCH 25/28] Update requirements --- .devcontainer/devcontainer.json | 2 +- pyproject.toml | 2 +- requirements.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 94552ce0..27f685df 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,7 +3,7 @@ { "name": "Python 3", // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile - "image": "mcr.microsoft.com/devcontainers/python:1-3.10-bullseye", + "image": "mcr.microsoft.com/devcontainers/python:1-3.12-bullseye", "features": { "ghcr.io/devcontainers/features/azure-cli:1": {}, "ghcr.io/devcontainers/features/node:1": {} diff --git a/pyproject.toml b/pyproject.toml index ee6a6013..499bd5dd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ classifiers = [ ] dependencies = [ - "msal[broker]>=1.31,<2", + "msal[broker]>=1.33,<2", "msal_extensions", "questionary", "prompt_toolkit>=3.0.41", diff --git a/requirements.txt b/requirements.txt index 7348357c..306dec75 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ prompt_toolkit requests cryptography questionary -msal[broker]>=1.31,<2 +msal[broker]>=1.33,<2 msal_extensions PyYAML jmespath From d566ea412aefdb74a74c25ca765c194173ff9ab5 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Tue, 6 Jan 2026 13:55:55 +0000 Subject: [PATCH 26/28] remove urllib3 depedency --- pylock.toml | 475 ------------------ requirements.txt | 1 - .../capacities_api_processor.py | 3 +- tox.toml | 3 +- 4 files changed, 2 insertions(+), 480 deletions(-) delete mode 100644 pylock.toml diff --git a/pylock.toml b/pylock.toml deleted file mode 100644 index 5989f08d..00000000 --- a/pylock.toml +++ /dev/null @@ -1,475 +0,0 @@ -lock-version = "1.0" -created-by = "pip" - -[[packages]] -name = "argcomplete" -version = "3.6.3" - -[[packages.wheels]] -name = "argcomplete-3.6.3-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/74/f5/9373290775639cb67a2fce7f629a1c240dce9f12fe927bc32b2736e16dfc/argcomplete-3.6.3-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "f5007b3a600ccac5d25bbce33089211dfd49eab4a7718da3f10e3082525a92ce" - -[[packages]] -name = "build" -version = "1.3.0" - -[[packages.wheels]] -name = "build-1.3.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4" - -[[packages]] -name = "cachetools" -version = "6.2.4" - -[[packages.wheels]] -name = "cachetools-6.2.4-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/2c/fc/1d7b80d0eb7b714984ce40efc78859c022cd930e402f599d8ca9e39c78a4/cachetools-6.2.4-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "69a7a52634fed8b8bf6e24a050fb60bff1c9bd8f6d24572b99c32d4e71e62a51" - -[[packages]] -name = "certifi" -version = "2025.11.12" - -[[packages.wheels]] -name = "certifi-2025.11.12-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b" - -[[packages]] -name = "cffi" -version = "2.0.0" - -[[packages.wheels]] -name = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" -url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" - -[packages.wheels.hashes] -sha256 = "3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb" - -[[packages]] -name = "chardet" -version = "5.2.0" - -[[packages.wheels]] -name = "chardet-5.2.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" - -[[packages]] -name = "charset-normalizer" -version = "3.4.4" - -[[packages.wheels]] -name = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" -url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" - -[packages.wheels.hashes] -sha256 = "4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8" - -[[packages]] -name = "colorama" -version = "0.4.6" - -[[packages.wheels]] -name = "colorama-0.4.6-py2.py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - -[[packages]] -name = "coverage" -version = "7.13.1" - -[[packages.wheels]] -name = "coverage-7.13.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" -url = "https://files.pythonhosted.org/packages/da/bf/6e8056a83fd7a96c93341f1ffe10df636dd89f26d5e7b9ca511ce3bcf0df/coverage-7.13.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" - -[packages.wheels.hashes] -sha256 = "d1443ba9acbb593fa7c1c29e011d7c9761545fe35e7652e85ce7f51a16f7e08d" - -[[packages]] -name = "cryptography" -version = "46.0.3" - -[[packages.wheels]] -name = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl" -url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl" - -[packages.wheels.hashes] -sha256 = "46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0" - -[[packages]] -name = "distlib" -version = "0.4.0" - -[[packages.wheels]] -name = "distlib-0.4.0-py2.py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16" - -[[packages]] -name = "exceptiongroup" -version = "1.3.1" - -[[packages.wheels]] -name = "exceptiongroup-1.3.1-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598" - -[[packages]] -name = "filelock" -version = "3.20.1" - -[[packages.wheels]] -name = "filelock-3.20.1-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/e3/7f/a1a97644e39e7316d850784c642093c99df1290a460df4ede27659056834/filelock-3.20.1-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a" - -[[packages]] -name = "idna" -version = "3.11" - -[[packages.wheels]] -name = "idna-3.11-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea" - -[[packages]] -name = "iniconfig" -version = "2.3.0" - -[[packages.wheels]] -name = "iniconfig-2.3.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12" - -[[packages]] -name = "jmespath" -version = "1.0.1" - -[[packages.wheels]] -name = "jmespath-1.0.1-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980" - -[[packages]] -name = "msal" -version = "1.32.3" - -[[packages.wheels]] -name = "msal-1.32.3-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/04/bf/81516b9aac7fd867709984d08eb4db1d2e3fe1df795c8e442cde9b568962/msal-1.32.3-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "b2798db57760b1961b142f027ffb7c8169536bf77316e99a0df5c4aaebb11569" - -[[packages]] -name = "msal-extensions" -version = "1.3.1" - -[[packages.wheels]] -name = "msal_extensions-1.3.1-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/5e/75/bd9b7bb966668920f06b200e84454c8f3566b102183bc55c5473d96cb2b9/msal_extensions-1.3.1-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca" - -[[packages]] -name = "packaging" -version = "25.0" - -[[packages.wheels]] -name = "packaging-25.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484" - -[[packages]] -name = "pip" -version = "25.3" - -[[packages.wheels]] -name = "pip-25.3-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "9655943313a94722b7774661c21049070f6bbb0a1516bf02f7c8d5d9201514cd" - -[[packages]] -name = "platformdirs" -version = "4.5.1" - -[[packages.wheels]] -name = "platformdirs-4.5.1-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31" - -[[packages]] -name = "pluggy" -version = "1.6.0" - -[[packages.wheels]] -name = "pluggy-1.6.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" - -[[packages]] -name = "prompt-toolkit" -version = "3.0.52" - -[[packages.wheels]] -name = "prompt_toolkit-3.0.52-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955" - -[[packages]] -name = "psutil" -version = "7.0.0" - -[[packages.wheels]] -name = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" -url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - -[packages.wheels.hashes] -sha256 = "a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993" - -[[packages]] -name = "pycparser" -version = "2.23" - -[[packages.wheels]] -name = "pycparser-2.23-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934" - -[[packages]] -name = "pygments" -version = "2.19.2" - -[[packages.wheels]] -name = "pygments-2.19.2-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" - -[[packages]] -name = "pyjwt" -version = "2.10.1" - -[[packages.wheels]] -name = "PyJWT-2.10.1-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb" - -[[packages]] -name = "pyproject-api" -version = "1.10.0" - -[[packages.wheels]] -name = "pyproject_api-1.10.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "8757c41a79c0f4ab71b99abed52b97ecf66bd20b04fa59da43b5840bac105a09" - -[[packages]] -name = "pyproject-hooks" -version = "1.2.0" - -[[packages.wheels]] -name = "pyproject_hooks-1.2.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913" - -[[packages]] -name = "pytest" -version = "9.0.2" - -[[packages.wheels]] -name = "pytest-9.0.2-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b" - -[[packages]] -name = "pytest-cov" -version = "7.0.0" - -[[packages.wheels]] -name = "pytest_cov-7.0.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861" - -[[packages]] -name = "pyyaml" -version = "6.0.3" - -[[packages.wheels]] -name = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" -url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" - -[packages.wheels.hashes] -sha256 = "b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8" - -[[packages]] -name = "questionary" -version = "2.1.1" - -[[packages.wheels]] -name = "questionary-2.1.1-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "a51af13f345f1cdea62347589fbb6df3b290306ab8930713bfae4d475a7d4a59" - -[[packages]] -name = "requests" -version = "2.32.5" - -[[packages.wheels]] -name = "requests-2.32.5-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6" - -[[packages]] -name = "setuptools" -version = "80.9.0" - -[[packages.wheels]] -name = "setuptools-80.9.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922" - -[[packages]] -name = "tomli" -version = "2.3.0" - -[[packages.wheels]] -name = "tomli-2.3.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b" - -[[packages]] -name = "tox" -version = "4.32.0" - -[[packages.wheels]] -name = "tox-4.32.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/fc/cc/e09c0d663a004945f82beecd4f147053567910479314e8d01ba71e5d5dea/tox-4.32.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "451e81dc02ba8d1ed20efd52ee409641ae4b5d5830e008af10fe8823ef1bd551" - -[[packages]] -name = "typing-extensions" -version = "4.15.0" - -[[packages.wheels]] -name = "typing_extensions-4.15.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" - -[[packages]] -name = "urllib3" -version = "2.6.2" - -[[packages.wheels]] -name = "urllib3-2.6.2-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd" - -[[packages]] -name = "vcrpy" -version = "8.1.0" - -[[packages.wheels]] -name = "vcrpy-8.1.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/09/77/892bcd82445ac949816205b51ab80deb86a492a315f2e290ed4eab35021c/vcrpy-8.1.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "fc4fb6e954c6d082ba6d329c6f3d1228f5b1b1d2836f9022c301b587cfad7378" - -[[packages]] -name = "virtualenv" -version = "20.35.4" - -[[packages.wheels]] -name = "virtualenv-20.35.4-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "c21c9cede36c9753eeade68ba7d523529f228a403463376cf821eaae2b650f1b" - -[[packages]] -name = "wcwidth" -version = "0.2.14" - -[[packages.wheels]] -name = "wcwidth-0.2.14-py2.py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1" - -[[packages]] -name = "wrapt" -version = "2.0.1" - -[[packages.wheels]] -name = "wrapt-2.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" -url = "https://files.pythonhosted.org/packages/a0/0a/e38fc0cee1f146c9fb266d8ef96ca39fb14a9eef165383004019aa53f88a/wrapt-2.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" - -[packages.wheels.hashes] -sha256 = "23097ed8bc4c93b7bf36fa2113c6c733c976316ce0ee2c816f64ca06102034ef" diff --git a/requirements.txt b/requirements.txt index 306dec75..5ba97844 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,6 @@ setuptools>=65.5.1 pip>=9.0.1 tox>=4.20.0 -urllib3<2.7.0,>=2.0.0 build prompt_toolkit requests diff --git a/tests/test_commands/api_processors/capacities_api_processor.py b/tests/test_commands/api_processors/capacities_api_processor.py index 246cdb41..e876566a 100644 --- a/tests/test_commands/api_processors/capacities_api_processor.py +++ b/tests/test_commands/api_processors/capacities_api_processor.py @@ -4,13 +4,12 @@ import json import re -from urllib3 import request from tests.test_commands.api_processors.base_api_processor import BaseAPIProcessor -from tests.test_commands.data.static_test_data import get_mock_data, get_static_data from tests.test_commands.api_processors.utils import ( load_request_json_body, load_response_json_body, ) +from tests.test_commands.data.static_test_data import get_mock_data, get_static_data class CapacitiesAPIProcessor(BaseAPIProcessor): diff --git a/tox.toml b/tox.toml index 2daaf960..8475d8f4 100644 --- a/tox.toml +++ b/tox.toml @@ -8,8 +8,7 @@ deps = [ "pytest>=8", "pytest-sugar", "pytest-cov", - "vcrpy", - "urllib3<2.7.0,>=2.0.0", + "vcrpy" ] commands = [ [ From 6023e5a0cdcfad1904da4494f764192b76c44fb8 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Tue, 6 Jan 2026 20:55:03 +0000 Subject: [PATCH 27/28] update msal depedency to 1.34 --- pylock.toml | 475 ----------------------------------------------- pyproject.toml | 2 +- requirements.txt | 2 +- 3 files changed, 2 insertions(+), 477 deletions(-) delete mode 100644 pylock.toml diff --git a/pylock.toml b/pylock.toml deleted file mode 100644 index 5989f08d..00000000 --- a/pylock.toml +++ /dev/null @@ -1,475 +0,0 @@ -lock-version = "1.0" -created-by = "pip" - -[[packages]] -name = "argcomplete" -version = "3.6.3" - -[[packages.wheels]] -name = "argcomplete-3.6.3-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/74/f5/9373290775639cb67a2fce7f629a1c240dce9f12fe927bc32b2736e16dfc/argcomplete-3.6.3-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "f5007b3a600ccac5d25bbce33089211dfd49eab4a7718da3f10e3082525a92ce" - -[[packages]] -name = "build" -version = "1.3.0" - -[[packages.wheels]] -name = "build-1.3.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4" - -[[packages]] -name = "cachetools" -version = "6.2.4" - -[[packages.wheels]] -name = "cachetools-6.2.4-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/2c/fc/1d7b80d0eb7b714984ce40efc78859c022cd930e402f599d8ca9e39c78a4/cachetools-6.2.4-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "69a7a52634fed8b8bf6e24a050fb60bff1c9bd8f6d24572b99c32d4e71e62a51" - -[[packages]] -name = "certifi" -version = "2025.11.12" - -[[packages.wheels]] -name = "certifi-2025.11.12-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b" - -[[packages]] -name = "cffi" -version = "2.0.0" - -[[packages.wheels]] -name = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" -url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" - -[packages.wheels.hashes] -sha256 = "3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb" - -[[packages]] -name = "chardet" -version = "5.2.0" - -[[packages.wheels]] -name = "chardet-5.2.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" - -[[packages]] -name = "charset-normalizer" -version = "3.4.4" - -[[packages.wheels]] -name = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" -url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" - -[packages.wheels.hashes] -sha256 = "4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8" - -[[packages]] -name = "colorama" -version = "0.4.6" - -[[packages.wheels]] -name = "colorama-0.4.6-py2.py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - -[[packages]] -name = "coverage" -version = "7.13.1" - -[[packages.wheels]] -name = "coverage-7.13.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" -url = "https://files.pythonhosted.org/packages/da/bf/6e8056a83fd7a96c93341f1ffe10df636dd89f26d5e7b9ca511ce3bcf0df/coverage-7.13.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" - -[packages.wheels.hashes] -sha256 = "d1443ba9acbb593fa7c1c29e011d7c9761545fe35e7652e85ce7f51a16f7e08d" - -[[packages]] -name = "cryptography" -version = "46.0.3" - -[[packages.wheels]] -name = "cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl" -url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl" - -[packages.wheels.hashes] -sha256 = "46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0" - -[[packages]] -name = "distlib" -version = "0.4.0" - -[[packages.wheels]] -name = "distlib-0.4.0-py2.py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16" - -[[packages]] -name = "exceptiongroup" -version = "1.3.1" - -[[packages.wheels]] -name = "exceptiongroup-1.3.1-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598" - -[[packages]] -name = "filelock" -version = "3.20.1" - -[[packages.wheels]] -name = "filelock-3.20.1-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/e3/7f/a1a97644e39e7316d850784c642093c99df1290a460df4ede27659056834/filelock-3.20.1-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a" - -[[packages]] -name = "idna" -version = "3.11" - -[[packages.wheels]] -name = "idna-3.11-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea" - -[[packages]] -name = "iniconfig" -version = "2.3.0" - -[[packages.wheels]] -name = "iniconfig-2.3.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12" - -[[packages]] -name = "jmespath" -version = "1.0.1" - -[[packages.wheels]] -name = "jmespath-1.0.1-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980" - -[[packages]] -name = "msal" -version = "1.32.3" - -[[packages.wheels]] -name = "msal-1.32.3-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/04/bf/81516b9aac7fd867709984d08eb4db1d2e3fe1df795c8e442cde9b568962/msal-1.32.3-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "b2798db57760b1961b142f027ffb7c8169536bf77316e99a0df5c4aaebb11569" - -[[packages]] -name = "msal-extensions" -version = "1.3.1" - -[[packages.wheels]] -name = "msal_extensions-1.3.1-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/5e/75/bd9b7bb966668920f06b200e84454c8f3566b102183bc55c5473d96cb2b9/msal_extensions-1.3.1-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca" - -[[packages]] -name = "packaging" -version = "25.0" - -[[packages.wheels]] -name = "packaging-25.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484" - -[[packages]] -name = "pip" -version = "25.3" - -[[packages.wheels]] -name = "pip-25.3-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "9655943313a94722b7774661c21049070f6bbb0a1516bf02f7c8d5d9201514cd" - -[[packages]] -name = "platformdirs" -version = "4.5.1" - -[[packages.wheels]] -name = "platformdirs-4.5.1-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31" - -[[packages]] -name = "pluggy" -version = "1.6.0" - -[[packages.wheels]] -name = "pluggy-1.6.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" - -[[packages]] -name = "prompt-toolkit" -version = "3.0.52" - -[[packages.wheels]] -name = "prompt_toolkit-3.0.52-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955" - -[[packages]] -name = "psutil" -version = "7.0.0" - -[[packages.wheels]] -name = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" -url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - -[packages.wheels.hashes] -sha256 = "a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993" - -[[packages]] -name = "pycparser" -version = "2.23" - -[[packages.wheels]] -name = "pycparser-2.23-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934" - -[[packages]] -name = "pygments" -version = "2.19.2" - -[[packages.wheels]] -name = "pygments-2.19.2-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" - -[[packages]] -name = "pyjwt" -version = "2.10.1" - -[[packages.wheels]] -name = "PyJWT-2.10.1-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb" - -[[packages]] -name = "pyproject-api" -version = "1.10.0" - -[[packages.wheels]] -name = "pyproject_api-1.10.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/54/cc/cecf97be298bee2b2a37dd360618c819a2a7fd95251d8e480c1f0eb88f3b/pyproject_api-1.10.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "8757c41a79c0f4ab71b99abed52b97ecf66bd20b04fa59da43b5840bac105a09" - -[[packages]] -name = "pyproject-hooks" -version = "1.2.0" - -[[packages.wheels]] -name = "pyproject_hooks-1.2.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913" - -[[packages]] -name = "pytest" -version = "9.0.2" - -[[packages.wheels]] -name = "pytest-9.0.2-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b" - -[[packages]] -name = "pytest-cov" -version = "7.0.0" - -[[packages.wheels]] -name = "pytest_cov-7.0.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861" - -[[packages]] -name = "pyyaml" -version = "6.0.3" - -[[packages.wheels]] -name = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" -url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" - -[packages.wheels.hashes] -sha256 = "b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8" - -[[packages]] -name = "questionary" -version = "2.1.1" - -[[packages.wheels]] -name = "questionary-2.1.1-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "a51af13f345f1cdea62347589fbb6df3b290306ab8930713bfae4d475a7d4a59" - -[[packages]] -name = "requests" -version = "2.32.5" - -[[packages.wheels]] -name = "requests-2.32.5-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6" - -[[packages]] -name = "setuptools" -version = "80.9.0" - -[[packages.wheels]] -name = "setuptools-80.9.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922" - -[[packages]] -name = "tomli" -version = "2.3.0" - -[[packages.wheels]] -name = "tomli-2.3.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b" - -[[packages]] -name = "tox" -version = "4.32.0" - -[[packages.wheels]] -name = "tox-4.32.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/fc/cc/e09c0d663a004945f82beecd4f147053567910479314e8d01ba71e5d5dea/tox-4.32.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "451e81dc02ba8d1ed20efd52ee409641ae4b5d5830e008af10fe8823ef1bd551" - -[[packages]] -name = "typing-extensions" -version = "4.15.0" - -[[packages.wheels]] -name = "typing_extensions-4.15.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" - -[[packages]] -name = "urllib3" -version = "2.6.2" - -[[packages.wheels]] -name = "urllib3-2.6.2-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd" - -[[packages]] -name = "vcrpy" -version = "8.1.0" - -[[packages.wheels]] -name = "vcrpy-8.1.0-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/09/77/892bcd82445ac949816205b51ab80deb86a492a315f2e290ed4eab35021c/vcrpy-8.1.0-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "fc4fb6e954c6d082ba6d329c6f3d1228f5b1b1d2836f9022c301b587cfad7378" - -[[packages]] -name = "virtualenv" -version = "20.35.4" - -[[packages.wheels]] -name = "virtualenv-20.35.4-py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "c21c9cede36c9753eeade68ba7d523529f228a403463376cf821eaae2b650f1b" - -[[packages]] -name = "wcwidth" -version = "0.2.14" - -[[packages.wheels]] -name = "wcwidth-0.2.14-py2.py3-none-any.whl" -url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl" - -[packages.wheels.hashes] -sha256 = "a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1" - -[[packages]] -name = "wrapt" -version = "2.0.1" - -[[packages.wheels]] -name = "wrapt-2.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" -url = "https://files.pythonhosted.org/packages/a0/0a/e38fc0cee1f146c9fb266d8ef96ca39fb14a9eef165383004019aa53f88a/wrapt-2.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" - -[packages.wheels.hashes] -sha256 = "23097ed8bc4c93b7bf36fa2113c6c733c976316ce0ee2c816f64ca06102034ef" diff --git a/pyproject.toml b/pyproject.toml index 499bd5dd..42acd21f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ classifiers = [ ] dependencies = [ - "msal[broker]>=1.33,<2", + "msal[broker]>=1.34,<2", "msal_extensions", "questionary", "prompt_toolkit>=3.0.41", diff --git a/requirements.txt b/requirements.txt index 306dec75..665b8c97 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ prompt_toolkit requests cryptography questionary -msal[broker]>=1.33,<2 +msal[broker]>=1.34,<2 msal_extensions PyYAML jmespath From d334629dcf1f4645b057e2d27f15ecddf2f3c700 Mon Sep 17 00:00:00 2001 From: Alon Yeshurun Date: Tue, 6 Jan 2026 21:47:39 +0000 Subject: [PATCH 28/28] Install broker only on macos and windows --- pyproject.toml | 3 ++- requirements.txt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 42acd21f..1994d431 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,8 @@ classifiers = [ ] dependencies = [ - "msal[broker]>=1.34,<2", + "msal[broker]>=1.34,<2 ; platform_system != 'Linux'", + "msal>=1.34,<2", "msal_extensions", "questionary", "prompt_toolkit>=3.0.41", diff --git a/requirements.txt b/requirements.txt index c8f9413c..7ef5d5e4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,8 @@ prompt_toolkit requests cryptography questionary -msal[broker]>=1.34,<2 +msal>=1.34,<2 +msal[broker]>=1.34,<2 ; platform_system != "Linux" msal_extensions PyYAML jmespath