Skip to content

[bot] Merge master/5aa5a35f into rel/dev - #1776

Merged
yenkins-admin merged 4 commits into
rel/devfrom
snapshot-master-5aa5a35f-to-rel/dev
Sep 4, 2026
Merged

[bot] Merge master/5aa5a35f into rel/dev#1776
yenkins-admin merged 4 commits into
rel/devfrom
snapshot-master-5aa5a35f-to-rel/dev

Conversation

@yenkins-admin

Copy link
Copy Markdown
Contributor

🚀 Automated PR to perform merge from master into rel/dev with changes up to 5aa5a35 (created by https://github.com/gooddata/gooddata-python-sdk/actions/runs/33849843316).

hkad98 and others added 4 commits September 4, 2026 09:31
Refreshes the lock and lifts the constraints that had frozen it, in one pass.
Ruff and ty are deliberately left for the two commits that follow, since each
forces source changes of its own and each commit here stays green on its own.

Lock refresh, already permitted by the declared ranges but frozen:
gooddata-code-convertors off the 11.35.0a2 alpha onto the 11.55.0 release,
pyarrow 23.0.1 -> 25.0.1, pydantic 2.12.5 -> 2.13.5, plus boto3, opentelemetry,
dynaconf, orjson, griffe, azure-storage-blob and the type stubs.

Compatible-release pins that had drifted a minor or more behind: pre-commit,
tox, tox-uv-bare, pytest-order, vcrpy, urllib3 and python-dotenv.

Upper bounds that had gone stale:
- attrs was capped <=24.2.0, cattrs <=24.1.1, structlog <25.0.0. The caps stay,
  in the same <= shape the repo already used, moved up to the current releases:
  attrs and cattrs <=26.1.0, structlog <=26.1.0. Note these three are CalVer,
  not semver: attrs 26.1.0 shipped 2026-03-19, cattrs 26.1.0 on 2026-02-18,
  structlog 26.1.0 on 2026-06-06. The leading number is the calendar year, so a
  semver-style major cap such as <27.0.0 would be a date fence that expires
  rather than a compatibility statement. Freezing at a known-good release says
  what is actually meant: this is the newest version we have tested against.
- prometheus-client ~=0.20.0 -> ~=0.26.0.
- tabulate ~=0.8.10 -> >=0.8.10,<1.0.0. It cannot reach 0.10 in the workspace
  because tbump pulls cli-ui which caps it, but that constrains only the
  release group, not consumers of gooddata-dbt.

Major versions for test tooling: pytest 8 -> 9.1.1, pytest-cov 6 -> 7.1.0 and
deepdiff 8 -> 9.1.0, across every member including gooddata-eval.

Hooks and CI: pre-commit-hooks v5 -> v6, uv-lock hook 0.12.5 -> 0.12.9, and
astral-sh/setup-uv v7 -> v10.0.1 at seven call sites. That action is pinned to
an exact tag because v8.0.0 removed its major-tag workflow, so v8, v9 and v10
have no floating tag and `@v10` does not resolve at all. v9.0.0 also flipped the
prune-cache default from true to false, so prune-cache: true is now set
explicitly to keep the previous behaviour.

Sphinx in the pandas and fdw docs requirements moves 5.1 -> 9.1. Nothing in CI
builds those docs and there is no readthedocs config, so it was verified by
building both sets locally against sphinx 9.1; both succeed.

ty is held at the 0.0.55 already in the lock rather than following the refresh;
the next-but-one commit takes it forward with the source change it needs.
…config

Ruff 0.16 changed two defaults, and both consequences live here rather than in
the dependency commit, so each commit stays independently green.

gooddata-pipelines was the only member declaring its own [tool.ruff] table.
That makes it a separate ruff configuration root, so it inherited nothing from
the workspace: not the rule selection, not the format excludes. The table
existed only to set line-length 80, but the side effect was that the package
had never been linted with the workspace rules at all, just with whatever ruff
happened to default to. Ruff 0.16 widened those defaults and surfaced 89
findings in code nobody had touched, which is what exposed the drift.

Removing the table puts the package on the same footing as every other member
and deletes the implicit coupling to ruff's defaults. Line length goes 80 -> 120
with the rest of the workspace, which is what reformats 51 files; that is
mechanical `ruff format` output and carries no behaviour change.

Of the lint findings, 47 were auto-fixable. The rest by hand:

- SIM102/SIM108 collapse nested conditionals and an if/else into a ternary.
- PERF401/PERF402 turn append loops into comprehensions.
- PLC0415 hoists a function-local import in test_input_processor to the top,
  matching the top-level-imports rule the workspace already enforces.
- D417 flagged two docstrings in input_validator naming raw_dataset_definitions
  and raw_field_definitions. Those parameters had been renamed to
  dataset_definitions and field_definitions and the docs were never updated, so
  the fix corrects stale names rather than adding new prose.
- PERF203 is suppressed at four sites with a reason on each. All four are
  deliberate per-item error handling in the provisioning loops: one user, group
  or filter may fail without stopping the rest, or the failing id is needed for
  the error context. The try cannot move out of the loop without changing
  behaviour, so the rule does not apply.

Ruff 0.16 also began formatting python code blocks inside markdown, which would
rewrite 72 documentation files including published code samples. Markdown is
excluded from the formatter; one exclusion suffices now that gooddata-pipelines
is no longer a separate config root.

The ruff pre-commit rev tracks the locked ruff so the two cannot drift.
195 pipelines tests pass; workspace lint, format and type-check are clean.
From ty 0.0.60, CatalogAttribute.find_label fails to type-check even though
self.labels is declared list[CatalogLabel]:

    error[unresolved-attribute]: Attribute `obj_id` is not defined on `None`
    in union `CatalogLabel | None`

Reduced to 13 lines, clean on 0.0.59 and erroring on 0.0.78:

    from typing import Union

    class Label:
        obj_id: str

    def find(labels: list[Label]) -> Union[Label, None]:
        return next(filter(lambda x: len(x.obj_id) > 0, labels), None)

Four things must coincide: a declared `T | None` return type, the
`next(..., None)` wrapper, a `filter` with a lambda, and the attribute access
appearing as an argument to a nested call. That last one is easy to miss and is
why earlier attempts to reproduce this failed:

    x.obj_id                      -> passes
    x.obj_id == "a"               -> passes
    len(x.obj_id) > 0             -> errors
    id_obj_to_key(x.obj_id) == k  -> errors, the real code

The None from the declared return type flows backwards through next's
`_T | _VT` into filter's `_T`. `list[Label]` is assignable to
`Iterable[Label | None]` by covariance, so nothing rejects it.

Tracked upstream at astral-sh/ty#4016 - open,
milestone Stable, reported against 0.0.60 which matches the bisect, not fixed
on main as of 0.0.78. The real fix is an Astral draft PR touching 42 files, so
waiting is not a plan and a new report would duplicate the existing one.

The workaround is to bind the result to a local, which removes the declared
return type as type context for the call. No cast, no suppression, and the
local still infers as CatalogLabel | None, so type safety is unchanged. The
comment at the site links the issue and says to inline it again once fixed.

Two genuine cleanups the newer ty found on the way:
- an unused blanket `# type: ignore` on the pyarrow ipc import fallback
- a redundant `cast(bytes, ...)` around `download_blob().readall()` in
  azure_storage, whose `typing.cast` import is now unused too

All 8 packages type-check clean on 0.0.78; lint and format are clean.
build: bring workspace dependencies up to date
@yenkins-admin
yenkins-admin merged commit 303b0b8 into rel/dev Sep 4, 2026
3 checks passed
@yenkins-admin
yenkins-admin deleted the snapshot-master-5aa5a35f-to-rel/dev branch September 4, 2026 07:41
@codecov

codecov Bot commented Sep 4, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 59.68254% with 127 lines in your changes missing coverage. Please review.
✅ Project coverage is 81.59%. Comparing base (45892f7) to head (5aa5a35).
⚠️ Report is 573 commits behind head on rel/dev.

Files with missing lines Patch % Lines
...ines/provisioning/entities/workspaces/workspace.py 31.81% 15 Missing ⚠️
...ng/entities/user_data_filters/user_data_filters.py 22.22% 14 Missing ⚠️
...pelines/provisioning/entities/users/user_groups.py 17.64% 14 Missing ⚠️
...elines/backup_and_restore/storage/azure_storage.py 21.42% 11 Missing ⚠️
...ata_pipelines/backup_and_restore/backup_manager.py 25.00% 9 Missing ⚠️
...ta_pipelines/backup_and_restore/restore_manager.py 73.07% 7 Missing ⚠️
...oning/entities/workspaces/workspace_data_parser.py 33.33% 6 Missing ⚠️
...pelines/src/gooddata_pipelines/api/gooddata_api.py 61.53% 5 Missing ⚠️
...pipelines/backup_and_restore/storage/s3_storage.py 28.57% 5 Missing ⚠️
...ning/entities/workspaces/workspace_data_filters.py 64.28% 5 Missing ⚠️
... and 16 more
Additional details and impacted files
@@           Coverage Diff            @@
##           rel/dev    #1776   +/-   ##
========================================
  Coverage    81.58%   81.59%           
========================================
  Files          275      275           
  Lines        19863    19848   -15     
========================================
- Hits         16205    16194   -11     
+ Misses        3658     3654    -4     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants