Conversation
📝 WalkthroughWalkthroughThis pull request updates the OpenAPI API client from version v0.10.15 to v0.10.17 across hundreds of generated files in Rust and Python. It introduces an optional Changes
Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
tests/integration/features/steps/cli_steps.py (1)
23-25:⚠️ Potential issue | 🟡 MinorValidate command shape before dropping the first token.
Line [24] assumes the first token is always
tower. If not, args are silently shifted and can produce misleading failures.Suggested fix
def run_command_with_env(context, command, env, input=None): cli_path = context.tower_binary @@ - cmd_parts = shlex.split(command) - full_command = [cli_path] + cmd_parts[1:] # Skip 'tower' prefix + cmd_parts = shlex.split(command) + if not cmd_parts: + raise AssertionError("Expected a non-empty CLI command") + if cmd_parts[0] != "tower": + raise AssertionError( + f"Expected command to start with 'tower', got: {cmd_parts[0]!r}" + ) + full_command = [cli_path, *cmd_parts[1:]] # Replace 'tower' with resolved binary🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tests/integration/features/steps/cli_steps.py` around lines 23 - 25, The code currently blindly drops the first token when building full_command by using cmd_parts[1:], which assumes cmd_parts[0] == 'tower' and can silently shift arguments; update the logic around cmd_parts and full_command to validate that cmd_parts is non-empty and that cmd_parts[0] == 'tower' before removing it (e.g., raise a clear exception or fail the test if the prefix is missing), and otherwise keep the original tokens so you don't silently change arguments—look for the variables cmd_parts and full_command in the CLI step and add the check and explicit error handling there.
🧹 Nitpick comments (1)
tests/integration/features/steps/cli_steps.py (1)
69-77: Deduplicate repeated API-key test environment construction.Both handlers build the same env payload; extracting one helper will keep future changes consistent.
Refactor sketch
+def _api_key_test_env(context): + env = os.environ.copy() + env["FORCE_COLOR"] = "1" + env["CLICOLOR_FORCE"] = "1" + env["TOWER_URL"] = context.tower_url + env["TOWER_API_KEY"] = context.api_key + env["HOME"] = context.temp_dir + return env + `@step`('I run "{command}" via CLI with API key') def step_run_cli_command_with_api_key(context, command): @@ - test_env = os.environ.copy() - test_env["FORCE_COLOR"] = "1" - test_env["CLICOLOR_FORCE"] = "1" - test_env["TOWER_URL"] = context.tower_url - test_env["TOWER_API_KEY"] = context.api_key - - # Use a temp HOME with no session.json to prove API key auth works standalone - test_env["HOME"] = context.temp_dir - - return run_command_with_env(context, command, test_env) + return run_command_with_env(context, command, _api_key_test_env(context)) @@ def step_run_cli_command_with_api_key_and_input(context, command, input): @@ - test_env = os.environ.copy() - test_env["FORCE_COLOR"] = "1" - test_env["CLICOLOR_FORCE"] = "1" - test_env["TOWER_URL"] = context.tower_url - test_env["TOWER_API_KEY"] = context.api_key - - # Use a temp HOME with no session.json to prove API key auth works standalone - test_env["HOME"] = context.temp_dir - - return run_command_with_env(context, command, test_env, input=input) + return run_command_with_env( + context, command, _api_key_test_env(context), input=input + )Also applies to: 84-93
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tests/integration/features/steps/cli_steps.py` around lines 69 - 77, Duplicate environment construction for API-key tests should be extracted into a single helper function (e.g., build_test_env or make_test_env) so both blocks use the same logic; implement a function in the steps module that accepts the context and returns a dict populated with FORCE_COLOR="1", CLICOLOR_FORCE="1", TOWER_URL=context.tower_url, TOWER_API_KEY=context.api_key and HOME=context.temp_dir, then replace the repeated inline assignments in the two locations (the blocks around the current test_env assignments) with a call to that helper to obtain test_env.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Outside diff comments:
In `@tests/integration/features/steps/cli_steps.py`:
- Around line 23-25: The code currently blindly drops the first token when
building full_command by using cmd_parts[1:], which assumes cmd_parts[0] ==
'tower' and can silently shift arguments; update the logic around cmd_parts and
full_command to validate that cmd_parts is non-empty and that cmd_parts[0] ==
'tower' before removing it (e.g., raise a clear exception or fail the test if
the prefix is missing), and otherwise keep the original tokens so you don't
silently change arguments—look for the variables cmd_parts and full_command in
the CLI step and add the check and explicit error handling there.
---
Nitpick comments:
In `@tests/integration/features/steps/cli_steps.py`:
- Around line 69-77: Duplicate environment construction for API-key tests should
be extracted into a single helper function (e.g., build_test_env or
make_test_env) so both blocks use the same logic; implement a function in the
steps module that accepts the context and returns a dict populated with
FORCE_COLOR="1", CLICOLOR_FORCE="1", TOWER_URL=context.tower_url,
TOWER_API_KEY=context.api_key and HOME=context.temp_dir, then replace the
repeated inline assignments in the two locations (the blocks around the current
test_env assignments) with a call to that helper to obtain test_env.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 9fa983eb-7eea-47c8-873a-c2eee7f6fe54
📒 Files selected for processing (223)
crates/tower-api/README.mdcrates/tower-api/src/apis/configuration.rscrates/tower-api/src/apis/default_api.rscrates/tower-api/src/apis/feature_flags_api.rscrates/tower-api/src/models/account.rscrates/tower-api/src/models/acknowledge_alert_response.rscrates/tower-api/src/models/acknowledge_all_alerts_response.rscrates/tower-api/src/models/alert.rscrates/tower-api/src/models/api_key.rscrates/tower-api/src/models/app.rscrates/tower-api/src/models/app_statistics.rscrates/tower-api/src/models/app_summary.rscrates/tower-api/src/models/app_version.rscrates/tower-api/src/models/authentication_context.rscrates/tower-api/src/models/batch_schedule_params.rscrates/tower-api/src/models/batch_schedule_response.rscrates/tower-api/src/models/cancel_run_response.rscrates/tower-api/src/models/catalog.rscrates/tower-api/src/models/catalog_property.rscrates/tower-api/src/models/claim_device_login_ticket_params.rscrates/tower-api/src/models/claim_device_login_ticket_response.rscrates/tower-api/src/models/create_account_params.rscrates/tower-api/src/models/create_account_params_flags_struct.rscrates/tower-api/src/models/create_account_response.rscrates/tower-api/src/models/create_api_key_params.rscrates/tower-api/src/models/create_api_key_response.rscrates/tower-api/src/models/create_app_params.rscrates/tower-api/src/models/create_app_response.rscrates/tower-api/src/models/create_authenticator_params.rscrates/tower-api/src/models/create_authenticator_response.rscrates/tower-api/src/models/create_catalog_params.rscrates/tower-api/src/models/create_catalog_response.rscrates/tower-api/src/models/create_device_login_ticket_response.rscrates/tower-api/src/models/create_environment_params.rscrates/tower-api/src/models/create_environment_response.rscrates/tower-api/src/models/create_guest_params.rscrates/tower-api/src/models/create_guest_response.rscrates/tower-api/src/models/create_password_reset_params.rscrates/tower-api/src/models/create_password_reset_response.rscrates/tower-api/src/models/create_sandbox_secrets_params.rscrates/tower-api/src/models/create_sandbox_secrets_response.rscrates/tower-api/src/models/create_schedule_params.rscrates/tower-api/src/models/create_schedule_response.rscrates/tower-api/src/models/create_secret_params.rscrates/tower-api/src/models/create_secret_response.rscrates/tower-api/src/models/create_session_params.rscrates/tower-api/src/models/create_session_response.rscrates/tower-api/src/models/create_team_params.rscrates/tower-api/src/models/create_team_response.rscrates/tower-api/src/models/create_webhook_params.rscrates/tower-api/src/models/create_webhook_response.rscrates/tower-api/src/models/delete_api_key_params.rscrates/tower-api/src/models/delete_api_key_response.rscrates/tower-api/src/models/delete_app_response.rscrates/tower-api/src/models/delete_authenticator_params.rscrates/tower-api/src/models/delete_authenticator_response.rscrates/tower-api/src/models/delete_catalog_response.rscrates/tower-api/src/models/delete_guest_output_body.rscrates/tower-api/src/models/delete_schedule_params.rscrates/tower-api/src/models/delete_schedule_response.rscrates/tower-api/src/models/delete_secret_response.rscrates/tower-api/src/models/delete_session_params.rscrates/tower-api/src/models/delete_session_response.rscrates/tower-api/src/models/delete_team_invitation_params.rscrates/tower-api/src/models/delete_team_invitation_response.rscrates/tower-api/src/models/delete_team_params.rscrates/tower-api/src/models/delete_team_response.rscrates/tower-api/src/models/delete_webhook_response.rscrates/tower-api/src/models/deploy_app_request.rscrates/tower-api/src/models/deploy_app_response.rscrates/tower-api/src/models/describe_account_body.rscrates/tower-api/src/models/describe_app_response.rscrates/tower-api/src/models/describe_app_version_response.rscrates/tower-api/src/models/describe_authentication_context_body.rscrates/tower-api/src/models/describe_catalog_response.rscrates/tower-api/src/models/describe_device_login_session_response.rscrates/tower-api/src/models/describe_email_preferences_body.rscrates/tower-api/src/models/describe_plan_response.rscrates/tower-api/src/models/describe_run_graph_response.rscrates/tower-api/src/models/describe_run_links.rscrates/tower-api/src/models/describe_run_logs_response.rscrates/tower-api/src/models/describe_run_response.rscrates/tower-api/src/models/describe_secrets_key_response.rscrates/tower-api/src/models/describe_session_response.rscrates/tower-api/src/models/describe_team_response.rscrates/tower-api/src/models/describe_webhook_response.rscrates/tower-api/src/models/email_subscriptions.rscrates/tower-api/src/models/encrypted_catalog_property.rscrates/tower-api/src/models/environment.rscrates/tower-api/src/models/error_detail.rscrates/tower-api/src/models/error_model.rscrates/tower-api/src/models/event_alert.rscrates/tower-api/src/models/event_error.rscrates/tower-api/src/models/event_log.rscrates/tower-api/src/models/event_shouldertap.rscrates/tower-api/src/models/event_warning.rscrates/tower-api/src/models/export_catalogs_params.rscrates/tower-api/src/models/export_catalogs_response.rscrates/tower-api/src/models/export_secrets_params.rscrates/tower-api/src/models/export_secrets_response.rscrates/tower-api/src/models/exported_catalog.rscrates/tower-api/src/models/exported_catalog_property.rscrates/tower-api/src/models/exported_secret.rscrates/tower-api/src/models/feature.rscrates/tower-api/src/models/featurebase_identity.rscrates/tower-api/src/models/generate_app_statistics_response.rscrates/tower-api/src/models/generate_authenticator_response.rscrates/tower-api/src/models/generate_run_statistics_response.rscrates/tower-api/src/models/generate_runner_credentials_response.rscrates/tower-api/src/models/get_feature_flag_response_body.rscrates/tower-api/src/models/guest.rscrates/tower-api/src/models/invite_team_member_params.rscrates/tower-api/src/models/invite_team_member_response.rscrates/tower-api/src/models/leave_team_response.rscrates/tower-api/src/models/list_alerts_response.rscrates/tower-api/src/models/list_api_keys_response.rscrates/tower-api/src/models/list_app_environments_response.rscrates/tower-api/src/models/list_app_versions_response.rscrates/tower-api/src/models/list_apps_response.rscrates/tower-api/src/models/list_authenticators_response.rscrates/tower-api/src/models/list_catalogs_response.rscrates/tower-api/src/models/list_environments_response.rscrates/tower-api/src/models/list_guests_response.rscrates/tower-api/src/models/list_my_team_invitations_response.rscrates/tower-api/src/models/list_runners_response.rscrates/tower-api/src/models/list_runs_response.rscrates/tower-api/src/models/list_schedules_response.rscrates/tower-api/src/models/list_secret_environments_response.rscrates/tower-api/src/models/list_secrets_response.rscrates/tower-api/src/models/list_team_invitations_response.rscrates/tower-api/src/models/list_team_members_response.rscrates/tower-api/src/models/list_teams_response.rscrates/tower-api/src/models/list_webhooks_response.rscrates/tower-api/src/models/organization.rscrates/tower-api/src/models/organization_usage.rscrates/tower-api/src/models/pagination.rscrates/tower-api/src/models/parameter.rscrates/tower-api/src/models/plan.rscrates/tower-api/src/models/refresh_session_params.rscrates/tower-api/src/models/refresh_session_response.rscrates/tower-api/src/models/regenerate_guest_login_url_params.rscrates/tower-api/src/models/regenerate_guest_login_url_response.rscrates/tower-api/src/models/remove_team_member_params.rscrates/tower-api/src/models/remove_team_member_response.rscrates/tower-api/src/models/resend_team_invitation_params.rscrates/tower-api/src/models/resend_team_invitation_response.rscrates/tower-api/src/models/run.rscrates/tower-api/src/models/run_app_initiator_data.rscrates/tower-api/src/models/run_app_params.rscrates/tower-api/src/models/run_app_response.rscrates/tower-api/src/models/run_attempt.rscrates/tower-api/src/models/run_failure_alert.rscrates/tower-api/src/models/run_graph_node.rscrates/tower-api/src/models/run_graph_run_id.rscrates/tower-api/src/models/run_initiator.rscrates/tower-api/src/models/run_initiator_details.rscrates/tower-api/src/models/run_log_line.rscrates/tower-api/src/models/run_parameter.rscrates/tower-api/src/models/run_results.rscrates/tower-api/src/models/run_retry_policy.rscrates/tower-api/src/models/run_run_initiator_details.rscrates/tower-api/src/models/run_statistics.rscrates/tower-api/src/models/run_timeseries_point.rscrates/tower-api/src/models/runner.rscrates/tower-api/src/models/runner_credentials.rscrates/tower-api/src/models/schedule.rscrates/tower-api/src/models/schedule_run_initiator_details.rscrates/tower-api/src/models/search_runs_response.rscrates/tower-api/src/models/secret.rscrates/tower-api/src/models/server_sent_events_inner.rscrates/tower-api/src/models/server_sent_events_inner_1.rscrates/tower-api/src/models/server_sent_events_inner_2.rscrates/tower-api/src/models/session.rscrates/tower-api/src/models/shoulder_tap.rscrates/tower-api/src/models/sse_warning.rscrates/tower-api/src/models/statistics_settings.rscrates/tower-api/src/models/team.rscrates/tower-api/src/models/team_invitation.rscrates/tower-api/src/models/team_membership.rscrates/tower-api/src/models/test_webhook_response.rscrates/tower-api/src/models/token.rscrates/tower-api/src/models/unverified_authenticator.rscrates/tower-api/src/models/update_account_params.rscrates/tower-api/src/models/update_account_response.rscrates/tower-api/src/models/update_app_params.rscrates/tower-api/src/models/update_app_response.rscrates/tower-api/src/models/update_catalog_params.rscrates/tower-api/src/models/update_catalog_response.rscrates/tower-api/src/models/update_email_preferences_body.rscrates/tower-api/src/models/update_environment_params.rscrates/tower-api/src/models/update_environment_response.rscrates/tower-api/src/models/update_my_team_invitation_params.rscrates/tower-api/src/models/update_my_team_invitation_response.rscrates/tower-api/src/models/update_organization_params.rscrates/tower-api/src/models/update_organization_response.rscrates/tower-api/src/models/update_password_reset_params.rscrates/tower-api/src/models/update_password_reset_response.rscrates/tower-api/src/models/update_plan_params.rscrates/tower-api/src/models/update_plan_response.rscrates/tower-api/src/models/update_schedule_params.rscrates/tower-api/src/models/update_schedule_response.rscrates/tower-api/src/models/update_secret_params.rscrates/tower-api/src/models/update_secret_response.rscrates/tower-api/src/models/update_team_member_params.rscrates/tower-api/src/models/update_team_member_response.rscrates/tower-api/src/models/update_team_params.rscrates/tower-api/src/models/update_team_response.rscrates/tower-api/src/models/update_user_params.rscrates/tower-api/src/models/update_user_response.rscrates/tower-api/src/models/update_webhook_params.rscrates/tower-api/src/models/update_webhook_response.rscrates/tower-api/src/models/usage_limit.rscrates/tower-api/src/models/user.rscrates/tower-api/src/models/verified_authenticator.rscrates/tower-api/src/models/verify_email_params.rscrates/tower-api/src/models/verify_email_response.rscrates/tower-api/src/models/webhook.rscrates/tower-cmd/src/catalogs.rssrc/tower/tower_api_client/models/catalog_property.pysrc/tower/tower_api_client/models/exported_catalog_property.pytests/integration/features/cli_api_key_auth.featuretests/integration/features/environment.pytests/integration/features/steps/cli_steps.py
show catalogcommandSummary by CodeRabbit
New Features
Updates