Skip to content

fix(storage): plumb custom CA and NO_PROXY into obstore - #2627

Merged
louisnow merged 1 commit into
mainfrom
feat/obstore-custom-ca-and-no-proxy
Jul 10, 2026
Merged

louisnow merged 1 commit into
mainfrom
feat/obstore-custom-ca-and-no-proxy

Conversation

@louisnow

@louisnow louisnow commented Jul 10, 2026 •

Copy link
Copy Markdown
Contributor

Object storage fronted by a private CA (self-hosted MinIO, an S3-compatible API behind a corp proxy) failed TLS verification, and NO_PROXY was ignored. Both should have worked all along — obstore simply didn't expose the client options until 0.11.0, which this repo already pins. This wires them in from config the SDK already reads:

  • root_certificate — custom CAs from SSL_CERT_DIR, so private-CA stores verify without allow_invalid_certificates. Reuses get_custom_ca_cert_bytes(), the same helper the Temporal client already uses, so all TLS clients (httpx/aiohttp, Temporal, obstore) now honor SSL_CERT_DIR consistently.
  • proxy_excludes — NO_PROXY, forwarded only when a proxy is set.

obstore adds root_certificate to the system trust store rather than replacing it (each PEM in the bundle goes through reqwest's add_root_certificate; built-in roots stay in effect), so public endpoints keep validating alongside the custom CA. Config logs show root_certificate as a byte count, not the raw PEM.

Tested with unit tests for both paths plus a real S3Store built with a trustme CA to confirm obstore accepts the keys.

@github-actions

github-actions Bot commented Jul 10, 2026 •

Copy link
Copy Markdown
Contributor

📜 Docstring Coverage Report

RESULT: PASSED (minimum: 30.0%, actual: 78.1%)

Detailed Coverage Report
======= Coverage for /home/runner/work/application-sdk/application-sdk/ ========
----------------------------------- Summary ------------------------------------
| Name                                                                                         | Total | Miss | Cover | Cover% |
|----------------------------------------------------------------------------------------------|-------|------|-------|--------|
| .claude/skills/capability-manifest/references/extractor.py                                   |    27 |    2 |    25 |    93% |
| application_sdk/__init__.py                                                                  |     1 |    0 |     1 |   100% |
| application_sdk/_discovery_errors.py                                                         |     7 |    0 |     7 |   100% |
| application_sdk/constants.py                                                                 |     4 |    1 |     3 |    75% |
| application_sdk/discovery.py                                                                 |    12 |    3 |     9 |    75% |
| application_sdk/main.py                                                                      |    32 |    6 |    26 |    81% |
| application_sdk/main_errors.py                                                               |     5 |    0 |     5 |   100% |
| application_sdk/version.py                                                                   |     1 |    0 |     1 |   100% |
| application_sdk/app/__init__.py                                                              |     1 |    0 |     1 |   100% |
| application_sdk/app/_ep_registration.py                                                      |     6 |    0 |     6 |   100% |
| application_sdk/app/base.py                                                                  |    73 |   18 |    55 |    75% |
| application_sdk/app/base_errors.py                                                           |     5 |    0 |     5 |   100% |
| application_sdk/app/client.py                                                                |     1 |    0 |     1 |   100% |
| application_sdk/app/context.py                                                               |    39 |    2 |    37 |    95% |
| application_sdk/app/entrypoint.py                                                            |    15 |    4 |    11 |    73% |
| application_sdk/app/registry.py                                                              |    40 |   11 |    29 |    72% |
| application_sdk/app/task.py                                                                  |    14 |    6 |     8 |    57% |
| application_sdk/clients/__init__.py                                                          |     2 |    1 |     1 |    50% |
| application_sdk/clients/_interface.py                                                        |     4 |    1 |     3 |    75% |
| application_sdk/clients/base.py                                                              |     6 |    1 |     5 |    83% |
| application_sdk/clients/models.py                                                            |     2 |    0 |     2 |   100% |
| application_sdk/clients/redis.py                                                             |    27 |    0 |    27 |   100% |
| application_sdk/clients/redis_errors.py                                                      |     5 |    0 |     5 |   100% |
| application_sdk/clients/sql.py                                                               |    22 |    1 |    21 |    95% |
| application_sdk/clients/sql_errors.py                                                        |    11 |    0 |    11 |   100% |
| application_sdk/clients/sql_typecasters.py                                                   |    10 |    4 |     6 |    60% |
| application_sdk/clients/ssl_utils.py                                                         |     8 |    0 |     8 |   100% |
| application_sdk/clients/azure/__init__.py                                                    |     1 |    0 |     1 |   100% |
| application_sdk/clients/azure/auth.py                                                        |     7 |    0 |     7 |   100% |
| application_sdk/clients/azure/azure_errors.py                                                |     8 |    0 |     8 |   100% |
| application_sdk/clients/azure/client.py                                                      |    13 |    0 |    13 |   100% |
| application_sdk/common/__init__.py                                                           |     1 |    0 |     1 |   100% |
| application_sdk/common/_env.py                                                               |     2 |    0 |     2 |   100% |
| application_sdk/common/_listing.py                                                           |     4 |    0 |     4 |   100% |
| application_sdk/common/aws_utils.py                                                          |    10 |    1 |     9 |    90% |
| application_sdk/common/aws_utils_errors.py                                                   |     7 |    0 |     7 |   100% |
| application_sdk/common/concurrency.py                                                        |     3 |    0 |     3 |   100% |
| application_sdk/common/env_warnings.py                                                       |     2 |    0 |     2 |   100% |
| application_sdk/common/error_codes.py                                                        |    15 |    3 |    12 |    80% |
| application_sdk/common/errors.py                                                             |     6 |    0 |     6 |   100% |
| application_sdk/common/file_converter.py                                                     |     9 |    5 |     4 |    44% |
| application_sdk/common/file_ops.py                                                           |    16 |    1 |    15 |    94% |
| application_sdk/common/models.py                                                             |     4 |    2 |     2 |    50% |
| application_sdk/common/path.py                                                               |     2 |    1 |     1 |    50% |
| application_sdk/common/spillable_dict.py                                                     |    17 |   11 |     6 |    35% |
| application_sdk/common/sql_filters.py                                                        |    14 |    2 |    12 |    86% |
| application_sdk/common/sql_filters_errors.py                                                 |     2 |    0 |     2 |   100% |
| application_sdk/common/transforms.py                                                         |     5 |    0 |     5 |   100% |
| application_sdk/common/types.py                                                              |     2 |    1 |     1 |    50% |
| application_sdk/common/utils.py                                                              |     2 |    0 |     2 |   100% |
| application_sdk/common/incremental/__init__.py                                               |     1 |    1 |     0 |     0% |
| application_sdk/common/incremental/helpers.py                                                |    12 |    1 |    11 |    92% |
| application_sdk/common/incremental/incremental_errors.py                                     |    11 |    0 |    11 |   100% |
| application_sdk/common/incremental/marker.py                                                 |     5 |    0 |     5 |   100% |
| application_sdk/common/incremental/models.py                                                 |    10 |    0 |    10 |   100% |
| application_sdk/common/incremental/column_extraction/__init__.py                             |     1 |    0 |     1 |   100% |
| application_sdk/common/incremental/column_extraction/analysis.py                             |     3 |    0 |     3 |   100% |
| application_sdk/common/incremental/column_extraction/backfill.py                             |     3 |    0 |     3 |   100% |
| application_sdk/common/incremental/state/__init__.py                                         |     1 |    1 |     0 |     0% |
| application_sdk/common/incremental/state/incremental_diff.py                                 |     8 |    0 |     8 |   100% |
| application_sdk/common/incremental/state/state_reader.py                                     |     2 |    0 |     2 |   100% |
| application_sdk/common/incremental/state/state_writer.py                                     |    10 |    0 |    10 |   100% |
| application_sdk/common/incremental/state/table_scope.py                                      |     8 |    0 |     8 |   100% |
| application_sdk/common/incremental/storage/__init__.py                                       |     1 |    1 |     0 |     0% |
| application_sdk/common/incremental/storage/duckdb_utils.py                                   |    12 |    2 |    10 |    83% |
| application_sdk/common/incremental/storage/rocksdb_utils.py                                  |     3 |    0 |     3 |   100% |
| application_sdk/contracts/__init__.py                                                        |     1 |    0 |     1 |   100% |
| application_sdk/contracts/base.py                                                            |    37 |    7 |    30 |    81% |
| application_sdk/contracts/cleanup.py                                                         |     5 |    0 |     5 |   100% |
| application_sdk/contracts/compat.py                                                          |     9 |    1 |     8 |    89% |
| application_sdk/contracts/events.py                                                          |    12 |    0 |    12 |   100% |
| application_sdk/contracts/storage.py                                                         |     6 |    1 |     5 |    83% |
| application_sdk/contracts/types.py                                                           |    15 |    0 |    15 |   100% |
| application_sdk/contracts/types_errors.py                                                    |     2 |    0 |     2 |   100% |
| application_sdk/credentials/__init__.py                                                      |     1 |    0 |     1 |   100% |
| application_sdk/credentials/agent.py                                                         |     7 |    1 |     6 |    86% |
| application_sdk/credentials/atlan.py                                                         |    12 |    6 |     6 |    50% |
| application_sdk/credentials/atlan_client.py                                                  |     6 |    0 |     6 |   100% |
| application_sdk/credentials/errors.py                                                        |    20 |   12 |     8 |    40% |
| application_sdk/credentials/git.py                                                           |     9 |    6 |     3 |    33% |
| application_sdk/credentials/oauth.py                                                         |    13 |    2 |    11 |    85% |
| application_sdk/credentials/ref.py                                                           |    17 |    1 |    16 |    94% |
| application_sdk/credentials/registry.py                                                      |    11 |    3 |     8 |    73% |
| application_sdk/credentials/resolver.py                                                      |    11 |    4 |     7 |    64% |
| application_sdk/credentials/spec.py                                                          |     6 |    1 |     5 |    83% |
| application_sdk/credentials/types.py                                                         |    35 |   17 |    18 |    51% |
| application_sdk/credentials/utils.py                                                         |     3 |    0 |     3 |   100% |
| application_sdk/dev/__init__.py                                                              |     1 |    0 |     1 |   100% |
| application_sdk/dev/_dapr.py                                                                 |    11 |    2 |     9 |    82% |
| application_sdk/dev/_dapr_errors.py                                                          |     5 |    4 |     1 |    20% |
| application_sdk/dev/_embedded.py                                                             |     3 |    0 |     3 |   100% |
| application_sdk/errors/__init__.py                                                           |     4 |    1 |     3 |    75% |
| application_sdk/errors/base.py                                                               |    10 |    2 |     8 |    80% |
| application_sdk/errors/categories.py                                                         |     3 |    0 |     3 |   100% |
| application_sdk/errors/leaves.py                                                             |    17 |    8 |     9 |    53% |
| application_sdk/errors/wire.py                                                               |     3 |    1 |     2 |    67% |
| application_sdk/execution/__init__.py                                                        |     1 |    0 |     1 |   100% |
| application_sdk/execution/decorators.py                                                      |     3 |    2 |     1 |    33% |
| application_sdk/execution/errors.py                                                          |     2 |    0 |     2 |   100% |
| application_sdk/execution/heartbeat.py                                                       |    17 |    2 |    15 |    88% |
| application_sdk/execution/retry.py                                                           |     7 |    0 |     7 |   100% |
| application_sdk/execution/sandbox.py                                                         |     4 |    0 |     4 |   100% |
| application_sdk/execution/settings.py                                                        |     7 |    1 |     6 |    86% |
| application_sdk/execution/shutdown.py                                                        |     4 |    0 |     4 |   100% |
| application_sdk/execution/_temporal/__init__.py                                              |     1 |    1 |     0 |     0% |
| application_sdk/execution/_temporal/_activity_errors.py                                      |     8 |    0 |     8 |   100% |
| application_sdk/execution/_temporal/_backend_errors.py                                       |     5 |    4 |     1 |    20% |
| application_sdk/execution/_temporal/_lock_errors.py                                          |     5 |    0 |     5 |   100% |
| application_sdk/execution/_temporal/activities.py                                            |     8 |    0 |     8 |   100% |
| application_sdk/execution/_temporal/activity_utils.py                                        |     6 |    0 |     6 |   100% |
| application_sdk/execution/_temporal/auth.py                                                  |    12 |    0 |    12 |   100% |
| application_sdk/execution/_temporal/backend.py                                               |    13 |    1 |    12 |    92% |
| application_sdk/execution/_temporal/converter.py                                             |     3 |    0 |     3 |   100% |
| application_sdk/execution/_temporal/eviction_retry.py                                        |     3 |    0 |     3 |   100% |
| application_sdk/execution/_temporal/lock_activities.py                                       |     3 |    0 |     3 |   100% |
| application_sdk/execution/_temporal/preflight_gate.py                                        |    11 |    2 |     9 |    82% |
| application_sdk/execution/_temporal/sdr.py                                                   |    12 |    7 |     5 |    42% |
| application_sdk/execution/_temporal/worker.py                                                |    10 |    5 |     5 |    50% |
| application_sdk/execution/_temporal/workflows.py                                             |     2 |    0 |     2 |   100% |
| application_sdk/execution/_temporal/interceptors/__init__.py                                 |     1 |    0 |     1 |   100% |
| application_sdk/execution/_temporal/interceptors/events.py                                   |    13 |    0 |    13 |   100% |
| application_sdk/execution/_temporal/interceptors/lock.py                                     |    10 |    2 |     8 |    80% |
| application_sdk/execution/_temporal/interceptors/log.py                                      |    19 |   12 |     7 |    37% |
| application_sdk/execution/_temporal/interceptors/metrics.py                                  |    18 |   15 |     3 |    17% |
| application_sdk/execution/_temporal/interceptors/outputs.py                                  |     9 |    0 |     9 |   100% |
| application_sdk/execution/_temporal/interceptors/trace.py                                    |     6 |    4 |     2 |    33% |
| application_sdk/handler/__init__.py                                                          |     1 |    0 |     1 |   100% |
| application_sdk/handler/base.py                                                              |    14 |    3 |    11 |    79% |
| application_sdk/handler/context.py                                                           |    18 |    5 |    13 |    72% |
| application_sdk/handler/contracts.py                                                         |    38 |    5 |    33 |    87% |
| application_sdk/handler/manifest.py                                                          |     5 |    0 |     5 |   100% |
| application_sdk/handler/service.py                                                           |    55 |   23 |    32 |    58% |
| application_sdk/handler/service_errors.py                                                    |     4 |    0 |     4 |   100% |
| application_sdk/infrastructure/__init__.py                                                   |     1 |    0 |     1 |   100% |
| application_sdk/infrastructure/_secret_utils.py                                              |     2 |    0 |     2 |   100% |
| application_sdk/infrastructure/bindings.py                                                   |    16 |    3 |    13 |    81% |
| application_sdk/infrastructure/capacity.py                                                   |    11 |    0 |    11 |   100% |
| application_sdk/infrastructure/context.py                                                    |     6 |    0 |     6 |   100% |
| application_sdk/infrastructure/credential_vault.py                                           |     7 |    3 |     4 |    57% |
| application_sdk/infrastructure/pubsub.py                                                     |    13 |    3 |    10 |    77% |
| application_sdk/infrastructure/secrets.py                                                    |    23 |    7 |    16 |    70% |
| application_sdk/infrastructure/state.py                                                      |    10 |    7 |     3 |    30% |
| application_sdk/infrastructure/_dapr/__init__.py                                             |     1 |    0 |     1 |   100% |
| application_sdk/infrastructure/_dapr/_dapr_errors.py                                         |     2 |    0 |     2 |   100% |
| application_sdk/infrastructure/_dapr/client.py                                               |    31 |    4 |    27 |    87% |
| application_sdk/infrastructure/_dapr/credential_vault.py                                     |    15 |    6 |     9 |    60% |
| application_sdk/infrastructure/_dapr/http.py                                                 |    19 |   12 |     7 |    37% |
| application_sdk/infrastructure/_redis/__init__.py                                            |     1 |    0 |     1 |   100% |
| application_sdk/infrastructure/_redis/capacity.py                                            |     9 |    4 |     5 |    56% |
| application_sdk/observability/__init__.py                                                    |     1 |    1 |     0 |     0% |
| application_sdk/observability/_objectstore_metric_exporter.py                                |    13 |    8 |     5 |    38% |
| application_sdk/observability/_objectstore_metric_reader.py                                  |     2 |    0 |     2 |   100% |
| application_sdk/observability/_prometheus_enrichment.py                                      |     6 |    3 |     3 |    50% |
| application_sdk/observability/context.py                                                     |     6 |    0 |     6 |   100% |
| application_sdk/observability/correlation.py                                                 |     6 |    0 |     6 |   100% |
| application_sdk/observability/dapr_log_forwarder.py                                          |    14 |    4 |    10 |    71% |
| application_sdk/observability/logger_adaptor.py                                              |    51 |    9 |    42 |    82% |
| application_sdk/observability/logger_adaptor_errors.py                                       |     2 |    0 |     2 |   100% |
| application_sdk/observability/metrics.py                                                     |     8 |    6 |     2 |    25% |
| application_sdk/observability/metrics_adaptor.py                                             |    13 |    2 |    11 |    85% |
| application_sdk/observability/models.py                                                      |     6 |    0 |     6 |   100% |
| application_sdk/observability/observability.py                                               |    21 |    4 |    17 |    81% |
| application_sdk/observability/pushgateway.py                                                 |    16 |   11 |     5 |    31% |
| application_sdk/observability/pushgateway_errors.py                                          |     3 |    0 |     3 |   100% |
| application_sdk/observability/resource_sampler.py                                            |     6 |    0 |     6 |   100% |
| application_sdk/observability/segment_client.py                                              |    15 |    1 |    14 |    93% |
| application_sdk/observability/trace_context.py                                               |     2 |    0 |     2 |   100% |
| application_sdk/observability/traces_adaptor.py                                              |    15 |    1 |    14 |    93% |
| application_sdk/observability/utils.py                                                       |     7 |    1 |     6 |    86% |
| application_sdk/observability/decorators/observability_decorator.py                          |     7 |    4 |     3 |    43% |
| application_sdk/outputs/__init__.py                                                          |     2 |    0 |     2 |   100% |
| application_sdk/outputs/collector.py                                                         |     9 |    0 |     9 |   100% |
| application_sdk/outputs/models.py                                                            |     3 |    0 |     3 |   100% |
| application_sdk/server/health.py                                                             |    20 |    0 |    20 |   100% |
| application_sdk/server/fastapi/models.py                                                     |    21 |   17 |     4 |    19% |
| application_sdk/server/fastapi/utils.py                                                      |     5 |    0 |     5 |   100% |
| application_sdk/server/mcp/__init__.py                                                       |     2 |    2 |     0 |     0% |
| application_sdk/server/mcp/decorators.py                                                     |     3 |    1 |     2 |    67% |
| application_sdk/server/mcp/models.py                                                         |     2 |    2 |     0 |     0% |
| application_sdk/server/mcp/server.py                                                         |     5 |    0 |     5 |   100% |
| application_sdk/server/middleware/__init__.py                                                |     1 |    0 |     1 |   100% |
| application_sdk/server/middleware/_constants.py                                              |     1 |    0 |     1 |   100% |
| application_sdk/server/middleware/log.py                                                     |     4 |    3 |     1 |    25% |
| application_sdk/storage/__init__.py                                                          |     1 |    0 |     1 |   100% |
| application_sdk/storage/_concurrency.py                                                      |     3 |    1 |     2 |    67% |
| application_sdk/storage/_credential_providers.py                                             |     4 |    0 |     4 |   100% |
| application_sdk/storage/_obstore_config.py                                                   |    13 |    0 |    13 |   100% |
| application_sdk/storage/_telemetry.py                                                        |     5 |    0 |     5 |   100% |
| application_sdk/storage/batch.py                                                             |     9 |    2 |     7 |    78% |
| application_sdk/storage/binding.py                                                           |    18 |    1 |    17 |    94% |
| application_sdk/storage/chunked.py                                                           |    10 |    0 |    10 |   100% |
| application_sdk/storage/cloud.py                                                             |    23 |    5 |    18 |    78% |
| application_sdk/storage/errors.py                                                            |    32 |   21 |    11 |    34% |
| application_sdk/storage/factory.py                                                           |     3 |    0 |     3 |   100% |
| application_sdk/storage/file_ref_sync.py                                                     |    13 |    3 |    10 |    77% |
| application_sdk/storage/ops.py                                                               |    27 |    1 |    26 |    96% |
| application_sdk/storage/preflight.py                                                         |     4 |    0 |     4 |   100% |
| application_sdk/storage/reference.py                                                         |    12 |    1 |    11 |    92% |
| application_sdk/storage/rolling.py                                                           |    31 |   12 |    19 |    61% |
| application_sdk/storage/rolling_errors.py                                                    |     4 |    0 |     4 |   100% |
| application_sdk/storage/transfer.py                                                          |    19 |    4 |    15 |    79% |
| application_sdk/storage/formats/__init__.py                                                  |    27 |    0 |    27 |   100% |
| application_sdk/storage/formats/format_errors.py                                             |    18 |    0 |    18 |   100% |
| application_sdk/storage/formats/json.py                                                      |    12 |    2 |    10 |    83% |
| application_sdk/storage/formats/parquet.py                                                   |    24 |    1 |    23 |    96% |
| application_sdk/storage/formats/utils.py                                                     |     9 |    2 |     7 |    78% |
| application_sdk/templates/__init__.py                                                        |     2 |    1 |     1 |    50% |
| application_sdk/templates/_template_errors.py                                                |    10 |    0 |    10 |   100% |
| application_sdk/templates/base_metadata_extractor.py                                         |     4 |    1 |     3 |    75% |
| application_sdk/templates/incremental_sql_metadata_extractor.py                              |    18 |    1 |    17 |    94% |
| application_sdk/templates/sql_app.py                                                         |    31 |    0 |    31 |   100% |
| application_sdk/templates/sql_app_errors.py                                                  |     7 |    0 |     7 |   100% |
| application_sdk/templates/sql_metadata_extractor.py                                          |    14 |    1 |    13 |    93% |
| application_sdk/templates/sql_query_extractor.py                                             |     6 |    1 |     5 |    83% |
| application_sdk/templates/contracts/__init__.py                                              |     1 |    0 |     1 |   100% |
| application_sdk/templates/contracts/base_metadata_extraction.py                              |     3 |    0 |     3 |   100% |
| application_sdk/templates/contracts/incremental_sql.py                                       |    26 |    5 |    21 |    81% |
| application_sdk/templates/contracts/sql_metadata.py                                          |    33 |    8 |    25 |    76% |
| application_sdk/templates/contracts/sql_query.py                                             |     7 |    0 |     7 |   100% |
| application_sdk/test_utils/integration/__init__.py                                           |     1 |    1 |     0 |     0% |
| application_sdk/testing/__init__.py                                                          |     1 |    0 |     1 |   100% |
| application_sdk/testing/_mustache.py                                                         |     2 |    0 |     2 |   100% |
| application_sdk/testing/fixtures.py                                                          |    10 |    0 |    10 |   100% |
| application_sdk/testing/mocks.py                                                             |    68 |   17 |    51 |    75% |
| application_sdk/testing/e2e/__init__.py                                                      |     1 |    0 |     1 |   100% |
| application_sdk/testing/e2e/_errors.py                                                       |    11 |    0 |    11 |   100% |
| application_sdk/testing/e2e/base.py                                                          |    20 |    1 |    19 |    95% |
| application_sdk/testing/e2e/client.py                                                        |    38 |    7 |    31 |    82% |
| application_sdk/testing/e2e/config.py                                                        |     2 |    0 |     2 |   100% |
| application_sdk/testing/e2e/credential.py                                                    |     2 |    0 |     2 |   100% |
| application_sdk/testing/e2e/logs.py                                                          |     6 |    1 |     5 |    83% |
| application_sdk/testing/e2e/payload.py                                                       |     9 |    0 |     9 |   100% |
| application_sdk/testing/e2e/pods.py                                                          |     5 |    1 |     4 |    80% |
| application_sdk/testing/e2e/portforward.py                                                   |     4 |    0 |     4 |   100% |
| application_sdk/testing/e2e/sql_app.py                                                       |     9 |    0 |     9 |   100% |
| application_sdk/testing/e2e/substitutions.py                                                 |     3 |    0 |     3 |   100% |
| application_sdk/testing/e2e/workflows.py                                                     |     3 |    0 |     3 |   100% |
| application_sdk/testing/full_dag/__init__.py                                                 |     1 |    0 |     1 |   100% |
| application_sdk/testing/full_dag/_errors.py                                                  |     1 |    0 |     1 |   100% |
| application_sdk/testing/full_dag/base.py                                                     |    15 |    1 |    14 |    93% |
| application_sdk/testing/full_dag/client.py                                                   |     1 |    0 |     1 |   100% |
| application_sdk/testing/full_dag/payload.py                                                  |     8 |    0 |     8 |   100% |
| application_sdk/testing/full_dag/sql_app.py                                                  |     5 |    0 |     5 |   100% |
| application_sdk/testing/hypothesis/__init__.py                                               |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/__init__.py                                    |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/sql_client.py                                  |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/clients/__init__.py                            |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/clients/sql.py                                 |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/common/__init__.py                             |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/common/logger.py                               |     3 |    0 |     3 |   100% |
| application_sdk/testing/hypothesis/strategies/handlers/__init__.py                           |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/handlers/sql/__init__.py                       |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/handlers/sql/sql_metadata.py                   |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/handlers/sql/sql_preflight.py                  |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/inputs/__init__.py                             |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/inputs/json_input.py                           |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/inputs/parquet_input.py                        |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/outputs/__init__.py                            |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/outputs/json_output.py                         |     2 |    1 |     1 |    50% |
| application_sdk/testing/hypothesis/strategies/outputs/statestore.py                          |     3 |    1 |     2 |    67% |
| application_sdk/testing/hypothesis/strategies/server/__init__.py                             |     1 |    1 |     0 |     0% |
| application_sdk/testing/hypothesis/strategies/server/fastapi/__init__.py                     |     1 |    1 |     0 |     0% |
| application_sdk/testing/integration/__init__.py                                              |     1 |    0 |     1 |   100% |
| application_sdk/testing/integration/_errors.py                                               |     6 |    0 |     6 |   100% |
| application_sdk/testing/integration/assertions.py                                            |    55 |   25 |    30 |    55% |
| application_sdk/testing/integration/client.py                                                |    18 |    0 |    18 |   100% |
| application_sdk/testing/integration/comparison.py                                            |    12 |    1 |    11 |    92% |
| application_sdk/testing/integration/lazy.py                                                  |    10 |    0 |    10 |   100% |
| application_sdk/testing/integration/models.py                                                |     9 |    0 |     9 |   100% |
| application_sdk/testing/integration/runner.py                                                |    24 |    2 |    22 |    92% |
| application_sdk/testing/integration/validation.py                                            |     7 |    0 |     7 |   100% |
| application_sdk/testing/parity/__init__.py                                                   |     1 |    0 |     1 |   100% |
| application_sdk/testing/parity/__main__.py                                                   |     2 |    1 |     1 |    50% |
| application_sdk/testing/parity/comparator.py                                                 |     8 |    0 |     8 |   100% |
| application_sdk/testing/parity/models.py                                                     |     5 |    1 |     4 |    80% |
| application_sdk/testing/parity/report.py                                                     |     4 |    0 |     4 |   100% |
| application_sdk/testing/scale_data_generator/__init__.py                                     |     1 |    0 |     1 |   100% |
| application_sdk/testing/scale_data_generator/config_loader.py                                |    11 |    4 |     7 |    64% |
| application_sdk/testing/scale_data_generator/data_generator.py                               |    10 |    3 |     7 |    70% |
| application_sdk/testing/scale_data_generator/driver.py                                       |     3 |    3 |     0 |     0% |
| application_sdk/testing/scale_data_generator/output_handler/__init__.py                      |     1 |    1 |     0 |     0% |
| application_sdk/testing/scale_data_generator/output_handler/base.py                          |     7 |    3 |     4 |    57% |
| application_sdk/testing/scale_data_generator/output_handler/csv_handler.py                   |     6 |    6 |     0 |     0% |
| application_sdk/testing/scale_data_generator/output_handler/json_handler.py                  |     5 |    5 |     0 |     0% |
| application_sdk/testing/scale_data_generator/output_handler/parquet_handler.py               |     6 |    6 |     0 |     0% |
| application_sdk/testing/sdr/__init__.py                                                      |     1 |    0 |     1 |   100% |
| application_sdk/testing/sdr/base.py                                                          |    13 |    2 |    11 |    85% |
| application_sdk/tools/__init__.py                                                            |     1 |    1 |     0 |     0% |
| application_sdk/tools/provision_credentials.py                                               |     2 |    1 |     1 |    50% |
| application_sdk/transformers/__init__.py                                                     |     4 |    2 |     2 |    50% |
| application_sdk/transformers/errors.py                                                       |     2 |    1 |     1 |    50% |
| application_sdk/transformers/atlas/__init__.py                                               |     6 |    1 |     5 |    83% |
| application_sdk/transformers/atlas/errors.py                                                 |     8 |    7 |     1 |    12% |
| application_sdk/transformers/atlas/sql.py                                                    |    25 |    4 |    21 |    84% |
| application_sdk/transformers/common/__init__.py                                              |     1 |    1 |     0 |     0% |
| application_sdk/transformers/common/last_sync.py                                             |     5 |    0 |     5 |   100% |
| application_sdk/transformers/common/utils.py                                                 |     6 |    0 |     6 |   100% |
| application_sdk/transformers/query/__init__.py                                               |    12 |    2 |    10 |    83% |
| application_sdk/transformers/query/errors.py                                                 |     4 |    3 |     1 |    25% |
| contract-toolkit/examples/agent-e2e/app/generated/__init__.py                                |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/agent-e2e/app/generated/_e2e_base.py                               |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/agent-e2e/app/generated/_e2e_credential.py                         |     3 |    3 |     0 |     0% |
| contract-toolkit/examples/agent-e2e/app/generated/_e2e_substitutions.py                      |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/agent-e2e/app/generated/_input.py                                  |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/behind-the-scenes/app/generated/__init__.py                        |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/behind-the-scenes/app/generated/_e2e_base.py                       |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/behind-the-scenes/app/generated/_e2e_substitutions.py              |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/behind-the-scenes/app/generated/_input.py                          |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/bundle/app/generated/crawler/__init__.py                           |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/bundle/app/generated/crawler/_e2e_base.py                          |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/bundle/app/generated/crawler/_e2e_credential.py                    |     3 |    3 |     0 |     0% |
| contract-toolkit/examples/bundle/app/generated/crawler/_input.py                             |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/bundle/app/generated/miner/__init__.py                             |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/bundle/app/generated/miner/_e2e_base.py                            |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/bundle/app/generated/miner/_e2e_substitutions.py                   |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/bundle/app/generated/miner/_input.py                               |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/connection-ref/app/generated/__init__.py                           |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/connection-ref/app/generated/_e2e_base.py                          |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/connection-ref/app/generated/_input.py                             |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/deploy/app/generated/__init__.py                                   |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/deploy/app/generated/_e2e_base.py                                  |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/deploy/app/generated/_e2e_substitutions.py                         |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/deploy/app/generated/_input.py                                     |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/fanin/app/generated/__init__.py                                    |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/fanin/app/generated/_e2e_base.py                                   |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/fanin/app/generated/_e2e_credential.py                             |     3 |    3 |     0 |     0% |
| contract-toolkit/examples/fanin/app/generated/_input.py                                      |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/full/app/generated/__init__.py                                     |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/full/app/generated/_e2e_base.py                                    |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/full/app/generated/_e2e_credential.py                              |     3 |    3 |     0 |     0% |
| contract-toolkit/examples/full/app/generated/_e2e_substitutions.py                           |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/full/app/generated/_input.py                                       |     3 |    3 |     0 |     0% |
| contract-toolkit/examples/minimal/app/generated/__init__.py                                  |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/minimal/app/generated/_e2e_base.py                                 |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/minimal/app/generated/_e2e_substitutions.py                        |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/minimal/app/generated/_input.py                                    |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/pools/app/generated/__init__.py                                    |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/pools/app/generated/_e2e_base.py                                   |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/pools/app/generated/_e2e_substitutions.py                          |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/pools/app/generated/_input.py                                      |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/publish-controls/app/generated/__init__.py                         |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/publish-controls/app/generated/_e2e_base.py                        |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/publish-controls/app/generated/_e2e_credential.py                  |     3 |    3 |     0 |     0% |
| contract-toolkit/examples/publish-controls/app/generated/_e2e_substitutions.py               |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/publish-controls/app/generated/_input.py                           |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/scheduled/app/generated/__init__.py                                |     1 |    1 |     0 |     0% |
| contract-toolkit/examples/scheduled/app/generated/_e2e_base.py                               |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/scheduled/app/generated/_e2e_substitutions.py                      |     2 |    2 |     0 |     0% |
| contract-toolkit/examples/scheduled/app/generated/_input.py                                  |     2 |    2 |     0 |     0% |
| contract-toolkit/scripts/test-sdk-import.py                                                  |     5 |    1 |     4 |    80% |
| packages/conformance/conformance/__init__.py                                                 |     1 |    0 |     1 |   100% |
| packages/conformance/conformance/cli.py                                                      |    12 |   10 |     2 |    17% |
| packages/conformance/conformance/bootstrap/__init__.py                                       |     1 |    0 |     1 |   100% |
| packages/conformance/conformance/bootstrap/args.py                                           |     2 |    0 |     2 |   100% |
| packages/conformance/conformance/bootstrap/autodetect.py                                     |     7 |    0 |     7 |   100% |
| packages/conformance/conformance/bootstrap/command.py                                        |     9 |    1 |     8 |    89% |
| packages/conformance/conformance/bootstrap/extract.py                                        |     4 |    0 |     4 |   100% |
| packages/conformance/conformance/bootstrap/render.py                                         |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/bootstrap/templates/build_conformance_args.py               |     3 |    2 |     1 |    33% |
| packages/conformance/conformance/renovate/__init__.py                                        |     1 |    0 |     1 |   100% |
| packages/conformance/conformance/renovate/classify.py                                        |    10 |    1 |     9 |    90% |
| packages/conformance/conformance/renovate/models.py                                          |    10 |    2 |     8 |    80% |
| packages/conformance/conformance/renovate/scan.py                                            |    10 |    6 |     4 |    40% |
| packages/conformance/conformance/suite/__init__.py                                           |     1 |    0 |     1 |   100% |
| packages/conformance/conformance/suite/runner.py                                             |     9 |    2 |     7 |    78% |
| packages/conformance/conformance/suite/checks/__init__.py                                    |     1 |    1 |     0 |     0% |
| packages/conformance/conformance/suite/checks/_entrypoint_contract_fields.py                 |    13 |    4 |     9 |    69% |
| packages/conformance/conformance/suite/checks/_sdk_contract_mixins.py                        |     2 |    0 |     2 |   100% |
| packages/conformance/conformance/suite/checks/_toolkit_baseline.py                           |     6 |    1 |     5 |    83% |
| packages/conformance/conformance/suite/checks/_version.py                                    |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/actions_pinning.py                             |    10 |    0 |    10 |   100% |
| packages/conformance/conformance/suite/checks/bootstrap_drift.py                             |    13 |    4 |     9 |    69% |
| packages/conformance/conformance/suite/checks/coverage_config.py                             |    12 |    3 |     9 |    75% |
| packages/conformance/conformance/suite/checks/dependency_conformance.py                      |    28 |    0 |    28 |   100% |
| packages/conformance/conformance/suite/checks/dev_entrypoint.py                              |     6 |    0 |     6 |   100% |
| packages/conformance/conformance/suite/checks/dockerfile_conformance.py                      |    17 |    1 |    16 |    94% |
| packages/conformance/conformance/suite/checks/generated_freshness.py                         |    23 |    0 |    23 |   100% |
| packages/conformance/conformance/suite/checks/gitignore_entries.py                           |     5 |    0 |     5 |   100% |
| packages/conformance/conformance/suite/checks/integration_marking.py                         |    12 |    2 |    10 |    83% |
| packages/conformance/conformance/suite/checks/sdr.py                                         |     9 |    0 |     9 |   100% |
| packages/conformance/conformance/suite/checks/sdr_test_checks.py                             |    10 |    3 |     7 |    70% |
| packages/conformance/conformance/suite/checks/test_quality.py                                |    18 |    7 |    11 |    61% |
| packages/conformance/conformance/suite/checks/test_structure.py                              |    10 |    3 |     7 |    70% |
| packages/conformance/conformance/suite/checks/_ast_common/__init__.py                        |     1 |    0 |     1 |   100% |
| packages/conformance/conformance/suite/checks/_ast_common/_cli.py                            |     6 |    3 |     3 |    50% |
| packages/conformance/conformance/suite/checks/_ast_common/_directives.py                     |     4 |    0 |     4 |   100% |
| packages/conformance/conformance/suite/checks/_ast_common/_discovery.py                      |     2 |    0 |     2 |   100% |
| packages/conformance/conformance/suite/checks/_ast_common/_findings.py                       |     2 |    0 |     2 |   100% |
| packages/conformance/conformance/suite/checks/_ast_common/_imports.py                        |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/_ast_common/_pytest_collection.py              |     4 |    0 |     4 |   100% |
| packages/conformance/conformance/suite/checks/_ast_common/_scope.py                          |     5 |    0 |     5 |   100% |
| packages/conformance/conformance/suite/checks/_ast_common/_toml_suppress.py                  |     4 |    1 |     3 |    75% |
| packages/conformance/conformance/suite/checks/app_name_alignment/__init__.py                 |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/app_name_alignment/_check.py                   |     3 |    1 |     2 |    67% |
| packages/conformance/conformance/suite/checks/app_name_alignment/_code_app_name.py           |    12 |    0 |    12 |   100% |
| packages/conformance/conformance/suite/checks/app_name_alignment/_contract_app_name.py       |     8 |    0 |     8 |   100% |
| packages/conformance/conformance/suite/checks/client_seam/__init__.py                        |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/client_seam/_raw_http_to_atlan.py              |    10 |    0 |    10 |   100% |
| packages/conformance/conformance/suite/checks/deprecation/__init__.py                        |     4 |    0 |     4 |   100% |
| packages/conformance/conformance/suite/checks/deprecation/_authoring.py                      |     4 |    0 |     4 |   100% |
| packages/conformance/conformance/suite/checks/deprecation/_consumer.py                       |     7 |    3 |     4 |    57% |
| packages/conformance/conformance/suite/checks/deprecation/_contract_compat.py                |     2 |    0 |     2 |   100% |
| packages/conformance/conformance/suite/checks/deprecation/_extractor.py                      |    18 |    5 |    13 |    72% |
| packages/conformance/conformance/suite/checks/deprecation/_ledger_schema.py                  |     7 |    1 |     6 |    86% |
| packages/conformance/conformance/suite/checks/deprecation/_manifest.py                       |    10 |    1 |     9 |    90% |
| packages/conformance/conformance/suite/checks/determinism/__init__.py                        |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/determinism/_p020_primitives.py                |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/determinism/_p021_io.py                        |     3 |    1 |     2 |    67% |
| packages/conformance/conformance/suite/checks/determinism/_p022_unawaited.py                 |     8 |    5 |     3 |    38% |
| packages/conformance/conformance/suite/checks/determinism/_p023_blocking_async.py            |    11 |    9 |     2 |    18% |
| packages/conformance/conformance/suite/checks/determinism/_p024_sync_atlan_client.py         |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/determinism/_p031_executor_offload.py          |     4 |    1 |     3 |    75% |
| packages/conformance/conformance/suite/checks/determinism/_workflow_methods.py               |     7 |    0 |     7 |   100% |
| packages/conformance/conformance/suite/checks/entrypoint/__init__.py                         |     4 |    0 |     4 |   100% |
| packages/conformance/conformance/suite/checks/entrypoint/_bootstrap_common.py                |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/entrypoint/_server_bootstrap.py                |     2 |    0 |     2 |   100% |
| packages/conformance/conformance/suite/checks/entrypoint/_worker_bootstrap.py                |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/entrypoint_alignment/__init__.py               |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/entrypoint_alignment/_check.py                 |     5 |    1 |     4 |    80% |
| packages/conformance/conformance/suite/checks/entrypoint_alignment/_code_entrypoints.py      |    11 |    0 |    11 |   100% |
| packages/conformance/conformance/suite/checks/entrypoint_alignment/_contract_entrypoints.py  |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/error_handling/__init__.py                     |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/error_handling/_checker.py                     |    14 |   12 |     2 |    14% |
| packages/conformance/conformance/suite/checks/error_handling/_collect.py                     |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/error_handling/_constants.py                   |     1 |    0 |     1 |   100% |
| packages/conformance/conformance/suite/checks/error_handling/_helpers.py                     |    17 |    3 |    14 |    82% |
| packages/conformance/conformance/suite/checks/error_handling/exception_chaining.py           |     5 |    3 |     2 |    40% |
| packages/conformance/conformance/suite/checks/error_handling/http_failure.py                 |    11 |    5 |     6 |    55% |
| packages/conformance/conformance/suite/checks/error_handling/security.py                     |     4 |    1 |     3 |    75% |
| packages/conformance/conformance/suite/checks/error_handling/silent_swallow.py               |    12 |    9 |     3 |    25% |
| packages/conformance/conformance/suite/checks/error_handling/untyped_raise.py                |     7 |    5 |     2 |    29% |
| packages/conformance/conformance/suite/checks/legacy_contract/__init__.py                    |     2 |    0 |     2 |   100% |
| packages/conformance/conformance/suite/checks/legacy_contract/_directives_pkl.py             |     4 |    0 |     4 |   100% |
| packages/conformance/conformance/suite/checks/legacy_contract/_scan.py                       |     8 |    1 |     7 |    88% |
| packages/conformance/conformance/suite/checks/logging/__init__.py                            |     4 |    0 |     4 |   100% |
| packages/conformance/conformance/suite/checks/logging/_base.py                               |     3 |    1 |     2 |    67% |
| packages/conformance/conformance/suite/checks/logging/_checker.py                            |    15 |   10 |     5 |    33% |
| packages/conformance/conformance/suite/checks/logging/_config.py                             |     6 |    0 |     6 |   100% |
| packages/conformance/conformance/suite/checks/logging/_constants.py                          |     1 |    0 |     1 |   100% |
| packages/conformance/conformance/suite/checks/logging/_crossfile.py                          |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/logging/_format.py                             |     8 |    0 |     8 |   100% |
| packages/conformance/conformance/suite/checks/logging/_helpers.py                            |    11 |    0 |    11 |   100% |
| packages/conformance/conformance/suite/checks/logging/_level.py                              |     5 |    0 |     5 |   100% |
| packages/conformance/conformance/suite/checks/logging/_performance.py                        |    19 |   13 |     6 |    32% |
| packages/conformance/conformance/suite/checks/logging/_print.py                              |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/logging/_security.py                           |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/logging/_toml.py                               |     5 |    1 |     4 |    80% |
| packages/conformance/conformance/suite/checks/logging/_traceback.py                          |     4 |    0 |     4 |   100% |
| packages/conformance/conformance/suite/checks/manifest_contract/__init__.py                  |     2 |    0 |     2 |   100% |
| packages/conformance/conformance/suite/checks/manifest_contract/_check.py                    |     4 |    0 |     4 |   100% |
| packages/conformance/conformance/suite/checks/manifest_contract/_code_outputs.py             |     7 |    0 |     7 |   100% |
| packages/conformance/conformance/suite/checks/manifest_contract/_manifest_refs.py            |     7 |    1 |     6 |    86% |
| packages/conformance/conformance/suite/checks/optimizations/__init__.py                      |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/optimizations/_asset_mapper.py                 |     8 |    1 |     7 |    88% |
| packages/conformance/conformance/suite/checks/optimizations/_pyatlan_v9.py                   |     3 |    0 |     3 |   100% |
| packages/conformance/conformance/suite/checks/optimizations/_stdlib_json.py                  |     5 |    2 |     3 |    60% |
| packages/conformance/conformance/suite/checks/orchestration/__init__.py                      |     5 |    0 |     5 |   100% |
| packages/conformance/conformance/suite/checks/orchestration/_direct_temporal_import.py       |     2 |    0 |     2 |   100% |
| packages/conformance/conformance/suite/checks/orchestration/_private_orchestration_import.py |     2 |    0 |     2 |   100% |
| packages/conformance/conformance/suite/checks/orchestration/_public_temporal_surface.py      |     6 |    1 |     5 |    83% |
| packages/conformance/conformance/suite/checks/orchestration/_temporal_common.py              |    16 |    1 |    15 |    94% |
| packages/conformance/conformance/suite/checks/orchestration/_temporal_import_confinement.py  |     2 |    0 |     2 |   100% |
| packages/conformance/conformance/suite/checks/prescriptions/__init__.py                      |     4 |    0 |     4 |   100% |
| packages/conformance/conformance/suite/checks/prescriptions/_app_state_seam.py               |     5 |    2 |     3 |    60% |
| packages/conformance/conformance/suite/checks/prescriptions/_category_override.py            |     6 |    2 |     4 |    67% |
| packages/conformance/conformance/suite/checks/prescriptions/_constants.py                    |     1 |    0 |     1 |   100% |
| packages/conformance/conformance/suite/checks/prescriptions/_contract_common.py              |    19 |    3 |    16 |    84% |
| packages/conformance/conformance/suite/checks/prescriptions/_contract_fields.py              |     6 |    1 |     5 |    83% |
| packages/conformance/conformance/suite/checks/prescriptions/_decorator_provenance.py         |     6 |    0 |     6 |   100% |
| packages/conformance/conformance/suite/checks/prescriptions/_error_code_prefix.py            |     9 |    0 |     9 |   100% |
|

This message was truncated. Download full message

@github-actions

github-actions Bot commented Jul 10, 2026 •

Copy link
Copy Markdown
Contributor

📦 Trivy Vulnerability Scan Results

Schema Version Created At Artifact Type
2 2026-07-10T11:29:18.784331747Z . repository

Report Summary

Target Type Vulnerabilities packages/conformance/uv.lock
uv ✅ None found requirements.txt pip
✅ None found uv.lock uv ✅ None found

Scan Result Details

packages/conformance/uv.lock
requirements.txt
uv.lock

@github-actions

github-actions Bot commented Jul 10, 2026 •

Copy link
Copy Markdown
Contributor

📦 Trivy Secret Scan Results

Schema Version Created At Artifact Type
2 2026-07-10T11:29:26.697161768Z . repository

Report Summary

Target Type Secrets packages/conformance/uv.lock
uv ✅ None found requirements.txt pip
✅ None found uv.lock uv ✅ None found

Scan Result Details

packages/conformance/uv.lock
requirements.txt
uv.lock

@atlan-ci

atlan-ci commented Jul 10, 2026 •

Copy link
Copy Markdown
Collaborator

☂️ Code Coverage

current status: ✅

Overall Coverage

Statements Covered Coverage Threshold Status
19465 17579 90% 0% 🟢

New Files

No new covered files...

Modified Files

No covered modified files...

updated for commit: 7a81410 by action🐍

@louisnow
louisnow marked this pull request as draft July 10, 2026 10:54
@louisnow
louisnow force-pushed the feat/obstore-custom-ca-and-no-proxy branch from 617c00c to 8f7bf34 Compare July 10, 2026 10:56
@louisnow louisnow changed the title feat(storage): plumb custom CA and NO_PROXY into obstore fix(storage): plumb custom CA and NO_PROXY into obstore Jul 10, 2026
@louisnow
louisnow force-pushed the feat/obstore-custom-ca-and-no-proxy branch 6 times, most recently from 6d0adbb to c04dc9e Compare July 10, 2026 11:13
Object-store traffic behind a private CA should have verified from the start,
and NO_PROXY should have been honored — obstore just lacked the client options
until 0.11.0, which this repo already pins. Wire both from existing config:

- root_certificate: sourced from SSL_CERT_DIR (get_custom_ca_cert_bytes, the
  same helper the Temporal client uses) so a private-CA-fronted store verifies
  without disabling checks. obstore adds these roots to the system trust store
  rather than replacing them, so public endpoints keep validating. Completes
  SSL_CERT_DIR parity across httpx/aiohttp, Temporal, and obstore.
- proxy_excludes: honor NO_PROXY when a proxy URL is set, retiring the prior
  'NO_PROXY isn't honored' gap.

root_certificate PEM bytes are collapsed to a byte-count in config logs.
@louisnow
louisnow force-pushed the feat/obstore-custom-ca-and-no-proxy branch from c04dc9e to 7a81410 Compare July 10, 2026 11:28
@louisnow

Copy link
Copy Markdown
Contributor Author

@sdk-review

@github-actions

github-actions Bot commented Jul 10, 2026 •

Copy link
Copy Markdown
Contributor

🔍 SDK Review (mothership) triggered by @louisnow at 2026-07-10T11:29:25.047Z.

Watch the workflow run live — the review summary will appear as a separate comment when complete (typical: 5–30 min, hard cap 2h).


🟥 Run ended without a clean completion — status error, cost $unknown, duration 5m 51s.
Error: sandbox_error — Execution failed

@mothership-ai

mothership-ai Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

SDK Review (mothership): PR #2627 — fix(storage): plumb custom CA and NO_PROXY into obstore

Verdict: READY TO MERGE

Small, focused fix that plumbs NO_PROXY (via proxy_excludes) and SSL_CERT_DIR custom CAs (via root_certificate) into obstore's ClientConfig, and extends log-redaction to summarize the PEM as a byte count so private-CA bundles never land in logs. Behavior is correctly gated (proxy_excludes only when proxy_url is set; root_certificate only when a custom CA is present) and the test matrix covers the presence/absence combinations plus lowercase no_proxy. This is fixing the cause (obstore doesn't read these env vars itself, so the SDK has to hand them in) — not a symptom.


Findings

application_sdk/storage/_obstore_config.py

  • Nit [QUAL] L390 — _redact_proxy_userinfo now also redacts root_certificate; the name no longer reflects what it does. Path: optional cleanup — rename to something like _log_safe_client_options in a follow-up, or refresh the docstring/name in this PR.
  • Nit [STRUCT] L164-L166 — the function-local from application_sdk.clients.ssl_utils import get_custom_ca_cert_bytes is annotated # noqa: PLC0415, but ssl_utils only imports application_sdk.constants and application_sdk.observability.logger_adaptor — no circular-import risk. Path: optional cleanup — hoist to module-level imports with the other application_sdk.* import, dropping the noqa.

Strengths

  • Correctly guards proxy_excludes on proxy_url being present (obstore ignores excludes otherwise) and matches urllib's NO_PROXY/no_proxy casing via getproxies_environment().get("no").
  • root_certificate reuses the existing get_custom_ca_cert_bytes() helper so obstore trusts the same CA bundle as httpx/aiohttp/Temporal — one env var, one code path.
  • Log-redaction extended to summarize the PEM bundle as <N bytes>; keeps the real config untouched and prevents cert noise / leakage in operator logs.
  • Determinism-safe: pure config assembly in obstore_client_options(), no run()/@entrypoint involvement.
  • Tests cover proxy set × NO_PROXY set/unset/lowercase, root_certificate present/absent, and the byte-count summary in the log path — including the existing exact-dict assertion updated to pin get_custom_ca_cert_bytes to None so it stays deterministic.

CI: all passing (2 Windows unit-test jobs still in progress at review time; no failures)
Models: Claude Opus 4.7 (review)
Cross-model agreement: N/A (Wave 2 skipped — small diff, zero blocking findings)
Run: view workflow logs + cost

@atlan-ci atlan-ci left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SDK reviewer's verdict: READY TO MERGE.

Full review summary is in the comment posted on this PR.

@louisnow
louisnow marked this pull request as ready for review July 10, 2026 11:44
@louisnow
louisnow added this pull request to the merge queue Jul 10, 2026
Merged via the queue into main with commit 7fa79cf Jul 10, 2026
57 of 58 checks passed
@louisnow
louisnow deleted the feat/obstore-custom-ca-and-no-proxy branch July 10, 2026 11:52
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