octopize.deploy_tool 2.3.1__tar.gz → 2.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/.gitignore +3 -0
  2. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/PKG-INFO +1 -2
  3. octopize_deploy_tool-2.6.0/infra/deployment/deployment-tool/src/octopize_avatar_deploy/steps/user.py +20 -0
  4. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/pyproject.toml +2 -19
  5. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/__init__.py +1 -1
  6. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/authentik_migration.py +6 -6
  7. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/cli.py +31 -31
  8. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/cli_test_harness.py +3 -6
  9. octopize_deploy_tool-2.6.0/src/octopize_avatar_deploy/configurator.py +197 -0
  10. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/configure.py +148 -290
  11. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/defaults.yaml +1 -1
  12. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/download_templates.py +11 -11
  13. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/generate_env_paths.py +2 -1
  14. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/input_gatherer.py +15 -15
  15. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/printer.py +1 -1
  16. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/public_url.py +3 -1
  17. octopize_deploy_tool-2.6.0/src/octopize_avatar_deploy/renderer.py +198 -0
  18. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/state_manager.py +91 -7
  19. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/base.py +7 -2
  20. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/component_selection.py +1 -4
  21. octopize_deploy_tool-2.6.0/src/octopize_avatar_deploy/steps/email.py +263 -0
  22. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/nginx.py +171 -2
  23. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/storage.py +0 -1
  24. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/target_environment.py +4 -1
  25. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/telemetry.py +13 -4
  26. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/template_provisioning.py +4 -1
  27. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/_env_fragment_api.template +4 -0
  28. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/docker-compose.yml.template +0 -6
  29. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/version_compat.py +21 -21
  30. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/conftest.py +72 -19
  31. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/__init__.py +2 -2
  32. {octopize_deploy_tool-2.3.1/tests/fixtures/config_round_trip_second → octopize_deploy_tool-2.6.0/tests/fixtures/basic_deployment}/expected/.deployment-state.yaml +31 -5
  33. {octopize_deploy_tool-2.3.1/tests/fixtures/config_round_trip_second → octopize_deploy_tool-2.6.0/tests/fixtures/basic_deployment}/expected/.env +8 -8
  34. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/docker-compose.yml +0 -6
  35. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/input.yaml +2 -0
  36. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/output.txt +30 -7
  37. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/.deployment-state.yaml +31 -5
  38. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/.env +8 -8
  39. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/docker-compose.yml +0 -6
  40. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/input.yaml +2 -0
  41. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/output.txt +30 -7
  42. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/.deployment-state.yaml +31 -5
  43. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/.env +8 -8
  44. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/deployment-config.yaml +6 -5
  45. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/docker-compose.yml +0 -6
  46. {octopize_deploy_tool-2.3.1/tests/fixtures/basic_deployment → octopize_deploy_tool-2.6.0/tests/fixtures/config_round_trip_second}/expected/.deployment-state.yaml +31 -5
  47. {octopize_deploy_tool-2.3.1/tests/fixtures/basic_deployment → octopize_deploy_tool-2.6.0/tests/fixtures/config_round_trip_second}/expected/.env +8 -8
  48. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/docker-compose.yml +0 -6
  49. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/.deployment-state.yaml +37 -11
  50. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/.env +7 -7
  51. octopize_deploy_tool-2.6.0/tests/fixtures/dev_mode_deployment/expected/docker-compose.yml +604 -0
  52. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/input.yaml +1 -0
  53. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/output.txt +30 -7
  54. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/invalid_port_config/output.txt +30 -7
  55. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/.deployment-state.yaml +31 -5
  56. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/.env +7 -7
  57. octopize_deploy_tool-2.6.0/tests/fixtures/no_telemetry/expected/docker-compose.yml +604 -0
  58. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/input.yaml +1 -0
  59. octopize_deploy_tool-2.6.0/tests/fixtures/no_telemetry/output.txt +122 -0
  60. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/.deployment-state.yaml +31 -5
  61. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/.env +7 -7
  62. octopize_deploy_tool-2.6.0/tests/fixtures/non_interactive_complete/expected/docker-compose.yml +604 -0
  63. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/output.txt +30 -7
  64. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_incomplete_config/output.txt +30 -7
  65. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_partial_config/output.txt +30 -7
  66. octopize_deploy_tool-2.6.0/tests/fixtures/output_dir_nested/output.txt +122 -0
  67. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/prompt_help/input.yaml +2 -0
  68. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/prompt_help/output.txt +30 -7
  69. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/resume_interrupted/first_run/output.txt +14 -0
  70. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/resume_interrupted/input_first_run.yaml +4 -2
  71. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/resume_interrupted/input_resume.yaml +1 -0
  72. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/resume_interrupted/resume/output.txt +35 -12
  73. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/save_config_interactive/output.txt +30 -7
  74. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/save_config_with_existing/input.yaml +2 -0
  75. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/save_config_with_existing/output.txt +30 -7
  76. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/type_mismatch_config/output.txt +30 -7
  77. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/integration/test_cli_integration.py +75 -6
  78. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/integration/test_generate_env.py +6 -2
  79. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_base.py +2 -2
  80. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_component_selection.py +1 -2
  81. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_email.py +152 -3
  82. octopize_deploy_tool-2.6.0/tests/steps/test_nginx.py +523 -0
  83. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_state_manager.py +142 -1
  84. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_storage.py +0 -3
  85. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_target_environment.py +9 -3
  86. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_telemetry.py +15 -1
  87. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_authentik_client.py +4 -2
  88. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_components.py +1 -2
  89. octopize_deploy_tool-2.6.0/tests/unit/test_configurator.py +318 -0
  90. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_deployment_configurator.py +34 -62
  91. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_input_gatherer.py +3 -1
  92. octopize_deploy_tool-2.6.0/tests/unit/test_renderer.py +280 -0
  93. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_rich_implementations.py +7 -15
  94. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_step_filtering.py +0 -4
  95. octopize_deploy_tool-2.3.1/src/octopize_avatar_deploy/steps/email.py +0 -178
  96. octopize_deploy_tool-2.3.1/tests/fixtures/dev_mode_deployment/expected/docker-compose.yml +0 -610
  97. octopize_deploy_tool-2.3.1/tests/fixtures/no_telemetry/expected/docker-compose.yml +0 -610
  98. octopize_deploy_tool-2.3.1/tests/fixtures/no_telemetry/output.txt +0 -99
  99. octopize_deploy_tool-2.3.1/tests/fixtures/non_interactive_complete/expected/docker-compose.yml +0 -610
  100. octopize_deploy_tool-2.3.1/tests/fixtures/output_dir_nested/output.txt +0 -99
  101. octopize_deploy_tool-2.3.1/tests/steps/test_nginx.py +0 -131
  102. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/README.md +0 -0
  103. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/components.py +0 -0
  104. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/deployment_mode.py +0 -0
  105. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/generate_env.py +0 -0
  106. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/output_spec.py +0 -0
  107. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/__init__.py +0 -0
  108. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/api_local_source.py +0 -0
  109. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/authentik.py +0 -0
  110. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/authentik_blueprint.py +0 -0
  111. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/database.py +0 -0
  112. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/local_source.py +0 -0
  113. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/logging.py +0 -0
  114. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/required.py +0 -0
  115. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/service_urls.py +0 -0
  116. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/user.py +0 -0
  117. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/.env.template +0 -0
  118. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/.template-version +0 -0
  119. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/_env_fragment_infra.template +0 -0
  120. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/_env_fragment_web.template +0 -0
  121. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/api.env.template +0 -0
  122. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/branding/favicon.ico +0 -0
  123. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/branding/logo.png +0 -0
  124. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_confirmation.html +0 -0
  125. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_exists.html +0 -0
  126. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_invitation.html +0 -0
  127. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_forgotten_password.html +0 -0
  128. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_password_changed.html +0 -0
  129. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_password_reset.html +0 -0
  130. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/octopize-avatar-blueprint.yaml +0 -0
  131. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/translations.json +0 -0
  132. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/compose.override.yaml.template +0 -0
  133. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/nginx.conf.template +0 -0
  134. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/python_client.env.template +0 -0
  135. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/web.env.template +0 -0
  136. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/topology_urls.py +0 -0
  137. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/url_contract.py +0 -0
  138. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/TESTING.md +0 -0
  139. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/__init__.py +0 -0
  140. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/authentik_migration/licenses.csv +0 -0
  141. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/authentik_migration/organizations.csv +0 -0
  142. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/authentik_migration/users.csv +0 -0
  143. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/branding/favicon.ico +0 -0
  144. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/branding/logo.png +0 -0
  145. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
  146. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_account_exists.html +0 -0
  147. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_account_invitation.html +0 -0
  148. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
  149. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_password_changed.html +0 -0
  150. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_password_reset.html +0 -0
  151. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
  152. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/translations.json +0 -0
  153. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/nginx/nginx.conf +0 -0
  154. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/branding/favicon.ico +0 -0
  155. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/branding/logo.png +0 -0
  156. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
  157. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_account_exists.html +0 -0
  158. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_account_invitation.html +0 -0
  159. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
  160. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_password_changed.html +0 -0
  161. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_password_reset.html +0 -0
  162. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
  163. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/translations.json +0 -0
  164. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/nginx/nginx.conf +0 -0
  165. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_not_found/output.txt +0 -0
  166. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/branding/favicon.ico +0 -0
  167. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/branding/logo.png +0 -0
  168. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
  169. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_account_exists.html +0 -0
  170. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_account_invitation.html +0 -0
  171. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
  172. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_password_changed.html +0 -0
  173. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_password_reset.html +0 -0
  174. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
  175. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/translations.json +0 -0
  176. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/nginx/nginx.conf +0 -0
  177. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/branding/favicon.ico +0 -0
  178. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/branding/logo.png +0 -0
  179. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
  180. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_account_exists.html +0 -0
  181. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_account_invitation.html +0 -0
  182. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
  183. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_password_changed.html +0 -0
  184. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_password_reset.html +0 -0
  185. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
  186. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/translations.json +0 -0
  187. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/nginx/nginx.conf +0 -0
  188. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/deploy_help/output.txt +0 -0
  189. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/branding/favicon.ico +0 -0
  190. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/branding/logo.png +0 -0
  191. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
  192. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_account_exists.html +0 -0
  193. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_account_invitation.html +0 -0
  194. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
  195. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_password_changed.html +0 -0
  196. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_password_reset.html +0 -0
  197. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
  198. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/translations.json +0 -0
  199. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/compose.override.yaml +0 -0
  200. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/nginx/nginx.conf +0 -0
  201. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/test-.npmrc +0 -0
  202. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/test-avatar-repo/services/api/main.py +0 -0
  203. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/test-avatar-website/package.json +0 -0
  204. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/generate_env_help/output.txt +0 -0
  205. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/generate_env_output_dir_error/output.txt +0 -0
  206. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/help/output.txt +0 -0
  207. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/invalid_port_config/config.yaml +0 -0
  208. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/invalid_url_config/config.yaml +0 -0
  209. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/invalid_url_config/output.txt +0 -0
  210. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/malformed_yaml/config.yaml +0 -0
  211. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/malformed_yaml/output.txt +0 -0
  212. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/missing_subcommand/output.txt +0 -0
  213. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/branding/favicon.ico +0 -0
  214. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/branding/logo.png +0 -0
  215. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
  216. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_account_exists.html +0 -0
  217. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_account_invitation.html +0 -0
  218. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
  219. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_password_changed.html +0 -0
  220. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_password_reset.html +0 -0
  221. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
  222. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/translations.json +0 -0
  223. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/nginx/nginx.conf +0 -0
  224. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/config.yaml +0 -0
  225. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/branding/favicon.ico +0 -0
  226. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/branding/logo.png +0 -0
  227. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
  228. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_account_exists.html +0 -0
  229. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_account_invitation.html +0 -0
  230. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
  231. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_password_changed.html +0 -0
  232. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_password_reset.html +0 -0
  233. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
  234. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/translations.json +0 -0
  235. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/nginx/nginx.conf +0 -0
  236. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_incomplete_config/config.yaml +0 -0
  237. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_no_config/output.txt +0 -0
  238. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_partial_config/config.yaml +0 -0
  239. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/output_dir_permission_denied/output.txt +0 -0
  240. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/save_config_with_existing/config.yaml +0 -0
  241. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/template_from_local_verbose/output.txt +0 -0
  242. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/fixtures/type_mismatch_config/config.yaml +0 -0
  243. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/integration/__init__.py +0 -0
  244. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_api_local_source.py +0 -0
  245. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_authentik.py +0 -0
  246. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_authentik_blueprint.py +0 -0
  247. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_database.py +0 -0
  248. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_local_source.py +0 -0
  249. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_logging.py +0 -0
  250. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_required.py +0 -0
  251. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_service_urls.py +0 -0
  252. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_user.py +0 -0
  253. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/steps/test_user_validation.py +0 -0
  254. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/test_cli_harness.py +0 -0
  255. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_authentik_migration.py +0 -0
  256. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_compare_helpers.py +0 -0
  257. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_deployment_runner.py +0 -0
  258. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_generate_env_cli.py +0 -0
  259. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_generic_prompt.py +0 -0
  260. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_output_spec.py +0 -0
  261. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_printer.py +0 -0
  262. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_public_url.py +0 -0
  263. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_topology_urls.py +0 -0
  264. {octopize_deploy_tool-2.3.1 → octopize_deploy_tool-2.6.0}/tests/unit/test_version_validation.py +0 -0
@@ -70,3 +70,6 @@ Thumbs.db
70
70
  !tests/fixtures/**/expected/.env
71
71
  config.*.yaml
72
72
  !config.example.yaml
73
+
74
+ # TLS test fixtures created dynamically by the test suite
75
+ tls/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: octopize.deploy_tool
3
- Version: 2.3.1
3
+ Version: 2.6.0
4
4
  Summary: Deployment configuration tool for Octopize Avatar platform
5
5
  Project-URL: Homepage, https://octopize.io
6
6
  Project-URL: Documentation, https://docs.octopize.io/docs/deploying/self-hosted
@@ -26,7 +26,6 @@ Requires-Dist: rich>=13.0.0
26
26
  Provides-Extra: dev
27
27
  Requires-Dist: pyright>=1.1.402; extra == 'dev'
28
28
  Requires-Dist: pytest>=7.0; extra == 'dev'
29
- Requires-Dist: ruff>=0.1.0; extra == 'dev'
30
29
  Description-Content-Type: text/markdown
31
30
 
32
31
  # Octopize Avatar Deployment Tool
@@ -0,0 +1,20 @@
1
+ """User authentication configuration step."""
2
+
3
+ from typing import Any
4
+
5
+ from .base import DeploymentStep
6
+
7
+
8
+ class UserStep(DeploymentStep):
9
+ """Handles user authentication configuration."""
10
+
11
+ name = "user"
12
+ description = "Configure user authentication settings"
13
+
14
+ def collect_config(self) -> dict[str, Any]:
15
+ """Collect user authentication configuration."""
16
+ return {}
17
+
18
+ def generate_secrets(self) -> dict[str, str]:
19
+ """Generate user-related secrets."""
20
+ return {}
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "octopize.deploy_tool"
7
- version = "2.3.1"
7
+ version = "2.6.0"
8
8
  description = "Deployment configuration tool for Octopize Avatar platform"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -36,7 +36,6 @@ dependencies = [
36
36
  dev = [
37
37
  "pytest>=7.0",
38
38
  "pyright>=1.1.402",
39
- "ruff>=0.1.0",
40
39
  ]
41
40
 
42
41
  [project.scripts]
@@ -98,23 +97,7 @@ exclude_lines = [
98
97
  ]
99
98
 
100
99
  [tool.ruff]
101
- target-version = "py313"
102
- line-length = 100
103
-
104
- [tool.ruff.lint]
105
- extend-select = [
106
- "E", # pycodestyle errors
107
- "W", # pycodestyle warnings
108
- "F", # pyflakes
109
- "I", # isort
110
- "B", # flake8-bugbear
111
- "C4", # flake8-comprehensions
112
- "UP", # pyupgrade
113
- ]
114
-
115
-
116
- [tool.ruff.lint.isort]
117
- known-first-party = ["octopize_avatar_deploy"]
100
+ extend = "../../../ruff.toml"
118
101
 
119
102
  [dependency-groups]
120
103
  dev = [
@@ -11,7 +11,7 @@ from .version_compat import (
11
11
  validate_template_version,
12
12
  )
13
13
 
14
- __version__ = "2.3.1"
14
+ __version__ = "2.6.0"
15
15
  __all__ = [
16
16
  "main",
17
17
  "DeploymentRunner",
@@ -327,7 +327,7 @@ class AuthentikClient:
327
327
  timestamp = datetime.now(UTC).isoformat()
328
328
  try:
329
329
  if dry_run:
330
- print(f"[DRY RUN] {op}")
330
+ print(f"[DRY RUN] {op}") # noqa: T201
331
331
  continue
332
332
 
333
333
  if op.op_type == OperationType.GROUP_CREATE:
@@ -336,7 +336,7 @@ class AuthentikClient:
336
336
  attributes=op.data["attributes"],
337
337
  )
338
338
  counts["groups_created"] += 1
339
- print(f"✓ Created group: {op.data['name']}")
339
+ print(f"✓ Created group: {op.data['name']}") # noqa: T201
340
340
 
341
341
  elif op.op_type == OperationType.USER_CREATE:
342
342
  self.create_user(
@@ -346,7 +346,7 @@ class AuthentikClient:
346
346
  attributes=op.data["attributes"],
347
347
  )
348
348
  counts["users_created"] += 1
349
- print(f"✓ Created user: {op.data['username']}")
349
+ print(f"✓ Created user: {op.data['username']}") # noqa: T201
350
350
 
351
351
  elif op.op_type == OperationType.GROUP_ASSIGN:
352
352
  self.assign_user_to_group(
@@ -354,7 +354,7 @@ class AuthentikClient:
354
354
  username=op.data["username"],
355
355
  )
356
356
  counts["assignments_made"] += 1
357
- print(f"✓ Assigned {op.data['username']} to {op.data['group_name']}")
357
+ print(f"✓ Assigned {op.data['username']} to {op.data['group_name']}") # noqa: T201
358
358
 
359
359
  if log_file:
360
360
  entry = LogEntry(
@@ -367,9 +367,9 @@ class AuthentikClient:
367
367
  log_file.write(json.dumps(entry.to_dict()) + "\n")
368
368
  log_file.flush()
369
369
 
370
- except Exception as e:
370
+ except Exception as e: # noqa: BLE001
371
371
  counts["errors"] += 1
372
- print(f"✗ Error processing {op}: {e}", file=sys.stderr)
372
+ print(f"✗ Error processing {op}: {e}", file=sys.stderr) # noqa: T201
373
373
  if log_file:
374
374
  entry = LogEntry(
375
375
  op_type=op.op_type.value,
@@ -78,7 +78,7 @@ def _run_deploy(
78
78
  input_gatherer: InputGatherer | None,
79
79
  ) -> None:
80
80
  """Run the deploy subcommand."""
81
- from octopize_avatar_deploy.configure import DeploymentRunner
81
+ from octopize_avatar_deploy.configure import DeploymentRunner # noqa: PLC0415
82
82
 
83
83
  mode = DeploymentMode(getattr(args, "mode", "production"))
84
84
  runner = DeploymentRunner(
@@ -102,7 +102,7 @@ def _run_deploy(
102
102
 
103
103
  def _parse_component_output_path(value: str) -> tuple[str, Path]:
104
104
  """Parse a COMPONENT=PATH output override from the CLI."""
105
- from octopize_avatar_deploy.components import get_component
105
+ from octopize_avatar_deploy.components import get_component # noqa: PLC0415
106
106
 
107
107
  component, separator, raw_path = value.partition("=")
108
108
  if not separator or not component or not raw_path:
@@ -118,7 +118,7 @@ def _parse_component_output_path(value: str) -> tuple[str, Path]:
118
118
 
119
119
  def _add_generate_env_cli_args(parser: argparse.ArgumentParser) -> None:
120
120
  """Add CLI arguments for the generate-env subcommand."""
121
- from octopize_avatar_deploy.components import get_all_components
121
+ from octopize_avatar_deploy.components import get_all_components # noqa: PLC0415
122
122
 
123
123
  component_names = ", ".join(get_all_components().keys())
124
124
 
@@ -189,8 +189,8 @@ def _run_generate_env(
189
189
  input_gatherer: InputGatherer | None,
190
190
  ) -> None:
191
191
  """Run the generate-env subcommand."""
192
- from octopize_avatar_deploy.components import get_all_components
193
- from octopize_avatar_deploy.generate_env import GenerateEnvRunner
192
+ from octopize_avatar_deploy.components import get_all_components # noqa: PLC0415
193
+ from octopize_avatar_deploy.generate_env import GenerateEnvRunner # noqa: PLC0415
194
194
 
195
195
  components = args.components or list(get_all_components().keys())
196
196
  output_path_overrides = {
@@ -265,7 +265,7 @@ def _add_authentik_migrate_cli_args(parser: argparse.ArgumentParser) -> None:
265
265
 
266
266
  def _run_authentik_migrate(args: argparse.Namespace) -> None:
267
267
  """Run the authentik-migrate subcommand."""
268
- from octopize_avatar_deploy.authentik_migration import (
268
+ from octopize_avatar_deploy.authentik_migration import ( # noqa: PLC0415
269
269
  AuthentikClient,
270
270
  MigrationParser,
271
271
  OperationType,
@@ -273,67 +273,67 @@ def _run_authentik_migrate(args: argparse.Namespace) -> None:
273
273
  )
274
274
 
275
275
  if args.failed_only and not args.from_log:
276
- print("⚠️ --failed-only requires --from-log", file=sys.stderr)
276
+ print("⚠️ --failed-only requires --from-log", file=sys.stderr) # noqa: T201
277
277
  sys.exit(1)
278
278
 
279
279
  if args.from_log:
280
- print(f"📂 Loading operations from log: {args.from_log}")
280
+ print(f"📂 Loading operations from log: {args.from_log}") # noqa: T201
281
281
  if args.failed_only:
282
- print("🔁 Replaying failed operations only")
282
+ print("🔁 Replaying failed operations only") # noqa: T201
283
283
  operations = load_operations_from_log(args.from_log, failed_only=args.failed_only)
284
- print(f"✓ Loaded {len(operations)} operations")
284
+ print(f"✓ Loaded {len(operations)} operations") # noqa: T201
285
285
  # Default the output log to <stem>_retry.<ext> to avoid overwriting the source log
286
286
  if args.log == "migration_log.jsonl":
287
287
  p = Path(args.from_log)
288
288
  args.log = str(p.with_stem(p.stem + "_retry"))
289
289
  else:
290
290
  if not args.users or not args.orgs or not args.licenses:
291
- print(
291
+ print( # noqa: T201
292
292
  "⚠️ --users, --orgs, and --licenses are required when not using --from-log",
293
293
  file=sys.stderr,
294
294
  )
295
295
  sys.exit(1)
296
296
 
297
- print("📖 Parsing CSV files...")
297
+ print("📖 Parsing CSV files...") # noqa: T201
298
298
  migration_parser = MigrationParser(
299
299
  users_csv=args.users,
300
300
  orgs_csv=args.orgs,
301
301
  licenses_csv=args.licenses,
302
302
  )
303
303
  operations = migration_parser.parse()
304
- print(f"✓ Parsed {len(operations)} operations")
304
+ print(f"✓ Parsed {len(operations)} operations") # noqa: T201
305
305
 
306
306
  group_creates = sum(1 for op in operations if op.op_type == OperationType.GROUP_CREATE)
307
307
  user_creates = sum(1 for op in operations if op.op_type == OperationType.USER_CREATE)
308
308
  assignments = sum(1 for op in operations if op.op_type == OperationType.GROUP_ASSIGN)
309
- print(
309
+ print( # noqa: T201
310
310
  f" - {group_creates} groups to create\n"
311
311
  f" - {user_creates} users to create\n"
312
312
  f" - {assignments} group assignments",
313
313
  )
314
314
 
315
315
  if args.dry_run:
316
- print("\n🔍 DRY RUN MODE - Operations:")
316
+ print("\n🔍 DRY RUN MODE - Operations:") # noqa: T201
317
317
  for op in operations:
318
- print(f" {op}")
318
+ print(f" {op}") # noqa: T201
319
319
  return
320
320
 
321
321
  if not args.authentik_url or not args.authentik_token:
322
- print("\n⚠️ For actual execution, provide --authentik-url and --authentik-token")
323
- print("Use --dry-run to see operations without executing")
322
+ print("\n⚠️ For actual execution, provide --authentik-url and --authentik-token") # noqa: T201
323
+ print("Use --dry-run to see operations without executing") # noqa: T201
324
324
  sys.exit(1)
325
325
 
326
- print(f"\n🚀 Executing operations against {args.authentik_url}...")
327
- print(f"📝 Logging to: {args.log}")
326
+ print(f"\n🚀 Executing operations against {args.authentik_url}...") # noqa: T201
327
+ print(f"📝 Logging to: {args.log}") # noqa: T201
328
328
  with AuthentikClient(base_url=args.authentik_url, token=args.authentik_token) as client:
329
329
  counts = client.execute_operations(operations, log_path=args.log)
330
330
 
331
- print("\n📊 Migration Summary:")
332
- print(f" ✓ Groups created: {counts['groups_created']}")
333
- print(f" ✓ Users created: {counts['users_created']}")
334
- print(f" ✓ Assignments made: {counts['assignments_made']}")
331
+ print("\n📊 Migration Summary:") # noqa: T201
332
+ print(f" ✓ Groups created: {counts['groups_created']}") # noqa: T201
333
+ print(f" ✓ Users created: {counts['users_created']}") # noqa: T201
334
+ print(f" ✓ Assignments made: {counts['assignments_made']}") # noqa: T201
335
335
  if counts["errors"] > 0:
336
- print(f" ✗ Errors: {counts['errors']}")
336
+ print(f" ✗ Errors: {counts['errors']}") # noqa: T201
337
337
  sys.exit(1)
338
338
 
339
339
 
@@ -391,7 +391,7 @@ def main() -> None:
391
391
  test_printer: Printer | None = None
392
392
  test_input_gatherer: InputGatherer | None = None
393
393
  if os.environ.get("AVATAR_DEPLOY_TEST_MODE") == "1":
394
- from octopize_avatar_deploy.cli_test_harness import (
394
+ from octopize_avatar_deploy.cli_test_harness import ( # noqa: PLC0415
395
395
  get_test_input_gatherer,
396
396
  get_test_printer,
397
397
  )
@@ -409,14 +409,14 @@ def main() -> None:
409
409
  else:
410
410
  raise RuntimeError(f"Unsupported command: {args.command}")
411
411
  except KeyboardInterrupt:
412
- print("\n\nConfiguration cancelled by user.")
412
+ print("\n\nConfiguration cancelled by user.") # noqa: T201
413
413
  sys.exit(1)
414
414
  except RuntimeError as e:
415
- print(f"\n✗ Error: {e}")
415
+ print(f"\n✗ Error: {e}") # noqa: T201
416
416
  sys.exit(1)
417
- except Exception as e:
418
- print(f"\n✗ Error: {e}")
419
- import traceback
417
+ except Exception as e: # noqa: BLE001
418
+ print(f"\n✗ Error: {e}") # noqa: T201
419
+ import traceback # noqa: PLC0415
420
420
 
421
421
  traceback.print_exc()
422
422
  sys.exit(1)
@@ -6,6 +6,7 @@ Allows testing the CLI with pre-configured responses instead of manual input.
6
6
  This enables automated end-to-end testing of the entire CLI workflow.
7
7
  """
8
8
 
9
+ import json
9
10
  import os
10
11
  import sys
11
12
  from pathlib import Path
@@ -118,23 +119,19 @@ class CLITestHarness:
118
119
  return e.code
119
120
  # If it's a string or other type, return 1
120
121
  return 1
121
- except Exception as e:
122
+ except Exception as e: # noqa: BLE001
122
123
  if not self.silent and not self.log_file:
123
- print(f"CLI test failed with exception: {e}", file=sys.stderr)
124
+ print(f"CLI test failed with exception: {e}", file=sys.stderr) # noqa: T201
124
125
  return 1
125
126
 
126
127
  @staticmethod
127
128
  def serialize_responses(responses: dict[str, str | bool | list[str | bool]]) -> str:
128
129
  """Serialize responses dict to string format using JSON."""
129
- import json
130
-
131
130
  return json.dumps(responses)
132
131
 
133
132
  @staticmethod
134
133
  def deserialize_responses(serialized: str) -> dict[str, str | bool | list[str | bool]]:
135
134
  """Deserialize responses from JSON string format."""
136
- import json
137
-
138
135
  if not serialized:
139
136
  return {}
140
137
 
@@ -0,0 +1,197 @@
1
+ """Step-based configuration orchestrator.
2
+
3
+ Drives the step-based collection of deployment values through interactive
4
+ prompts or a config YAML file. Works entirely in-memory except for the
5
+ optional resume-state file managed by ``DeploymentState``.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from collections.abc import Callable
11
+ from pathlib import Path
12
+ from typing import Any
13
+
14
+ import yaml
15
+
16
+ from octopize_avatar_deploy.deployment_mode import DeploymentMode
17
+ from octopize_avatar_deploy.input_gatherer import InputGatherer
18
+ from octopize_avatar_deploy.output_spec import OutputSpec
19
+ from octopize_avatar_deploy.printer import Printer
20
+ from octopize_avatar_deploy.state_manager import DeploymentState
21
+ from octopize_avatar_deploy.steps.base import DeploymentStep
22
+
23
+
24
+ class Configurator:
25
+ """Step-based configuration collector.
26
+
27
+ Orchestrates deployment steps to resolve configuration values from
28
+ interactive prompts or a pre-loaded config file. Returns the
29
+ :class:`~octopize_avatar_deploy.state_manager.DeploymentState` populated
30
+ with the resolved config, accumulated secrets, and any post-generation
31
+ render specs from step hooks.
32
+
33
+ Filesystem access is limited to:
34
+
35
+ - Reading an optional config YAML file passed to :meth:`run`.
36
+ - Delegating incremental persistence to the provided ``state`` object
37
+ (which writes to disk only when its ``state_file`` is not ``None``).
38
+
39
+ Args:
40
+ output_dir: Directory used for step initialisation (forwarded to each
41
+ step constructor).
42
+ defaults: Pre-loaded defaults dict (typically from ``defaults.yaml``).
43
+ config: Shared configuration dict mutated in-place by each step.
44
+ state: Resume-state object; tracks step completion, config snapshots,
45
+ secrets, and post-generation specs. When constructed with
46
+ ``state_file=None`` the state is in-memory only and ``save()``
47
+ calls are no-ops.
48
+ step_classes: Ordered list of step classes to execute (already filtered
49
+ by deployment mode).
50
+ mode: Deployment mode; stored as ``config["deployment_mode"]``.
51
+ printer: Progress output sink.
52
+ input_gatherer: Interactive-prompt handler.
53
+ on_step_complete: Optional callback invoked after each step completes,
54
+ *in addition to* the state's own auto-save. Useful for callers
55
+ that want to perform extra work (e.g. additional serialisation)
56
+ on each checkpoint.
57
+ """
58
+
59
+ def __init__(
60
+ self,
61
+ output_dir: Path,
62
+ defaults: dict[str, Any],
63
+ config: dict[str, Any],
64
+ state: DeploymentState,
65
+ step_classes: list[type[DeploymentStep]],
66
+ mode: DeploymentMode,
67
+ printer: Printer,
68
+ input_gatherer: InputGatherer,
69
+ on_step_complete: Callable[[], None] | None = None,
70
+ ) -> None:
71
+ self.output_dir = output_dir
72
+ self.defaults = defaults
73
+ self.config = config
74
+ self.state = state
75
+ self.step_classes = step_classes
76
+ self.mode = mode
77
+ self.printer = printer
78
+ self.input_gatherer = input_gatherer
79
+ self.on_step_complete = on_step_complete
80
+
81
+ def run(
82
+ self,
83
+ interactive: bool = True,
84
+ config_file: Path | None = None,
85
+ ) -> DeploymentState:
86
+ """Execute all steps and return the populated deployment state.
87
+
88
+ Args:
89
+ interactive: Whether to prompt the user for missing values.
90
+ config_file: Optional YAML file used to pre-populate config values.
91
+
92
+ Returns:
93
+ The :class:`~octopize_avatar_deploy.state_manager.DeploymentState`
94
+ passed at construction time, now populated with the resolved config
95
+ dict, accumulated secrets, and post-generation render specs.
96
+
97
+ Raises:
98
+ RuntimeError: If the config file cannot be loaded or parsed.
99
+ ValueError: If a step fails validation.
100
+ """
101
+ # ------------------------------------------------------------------ #
102
+ # 1. Resume-state handling
103
+ # ------------------------------------------------------------------ #
104
+ if self.state.has_started() and not self.state.is_complete():
105
+ if interactive:
106
+ self.state.print_status(self.printer)
107
+ self.printer.print_header("")
108
+ response = self.input_gatherer.prompt_yes_no(
109
+ "Resume from where you left off?", default=True, key="resume.continue"
110
+ )
111
+ if not response:
112
+ self.printer.print("Starting fresh configuration...")
113
+ self.state.reset()
114
+ else:
115
+ self.printer.print("Resuming from last completed step...")
116
+ self.config.update(self.state.get_config())
117
+ else:
118
+ # Non-interactive: always resume automatically.
119
+ self.config.update(self.state.get_config())
120
+
121
+ # ------------------------------------------------------------------ #
122
+ # 2. Load config file
123
+ # ------------------------------------------------------------------ #
124
+ if config_file and config_file.exists():
125
+ self.printer.print(f"Loading configuration from {config_file}...")
126
+ try:
127
+ with open(config_file) as f:
128
+ loaded_config = yaml.safe_load(f) or {}
129
+ except yaml.YAMLError as e:
130
+ raise RuntimeError(f"Failed to parse YAML config file: {e}") from e
131
+ except Exception as e:
132
+ raise RuntimeError(f"Failed to load config file: {e}") from e
133
+
134
+ self.config.update(loaded_config)
135
+ # ------------------------------------------------------------------ #
136
+ # 3. Instantiate and run steps
137
+ # ------------------------------------------------------------------ #
138
+ steps = [
139
+ step_class(
140
+ self.output_dir,
141
+ self.defaults,
142
+ self.config,
143
+ interactive,
144
+ self.printer,
145
+ self.input_gatherer,
146
+ )
147
+ for step_class in self.step_classes
148
+ ]
149
+
150
+ self.printer.print_header("Avatar Deployment Configuration")
151
+ self.printer.print()
152
+ self.printer.print("Executing configuration steps...")
153
+ self.printer.print()
154
+
155
+ for i, step in enumerate(steps):
156
+ step_name = f"step_{i}_{step.name}"
157
+
158
+ if self.state.is_step_completed(step_name):
159
+ self.printer.print_step(step.description, skipped=True)
160
+ continue
161
+
162
+ self.printer.print_step(step.description)
163
+ self.state.mark_step_started(step_name)
164
+
165
+ step_config = step.collect_config()
166
+ self.config.update(step_config)
167
+
168
+ step_secrets = step.generate_secrets()
169
+ self.state.update_secrets(step_secrets)
170
+
171
+ if not step.validate():
172
+ raise ValueError(f"Validation failed for step: {step.name}")
173
+
174
+ self.state.mark_step_completed(step_name)
175
+ self.state.update_config(self.config)
176
+
177
+ if self.on_step_complete:
178
+ self.on_step_complete()
179
+
180
+ # ------------------------------------------------------------------ #
181
+ # 4. Collect post-generation render specs and store in state
182
+ # ------------------------------------------------------------------ #
183
+ post_generation_specs: list[OutputSpec] = []
184
+
185
+ def _collect_spec(template_name: str, output_name: str) -> None:
186
+ post_generation_specs.append(OutputSpec(template_name, output_name))
187
+
188
+ for step in steps:
189
+ step.after_config_generation(_collect_spec)
190
+
191
+ self.state.set_post_generation_specs(post_generation_specs)
192
+
193
+ # Ensure the final config state is always flushed, even when no steps ran
194
+ # or the last step didn't trigger a save (e.g. early resume skip).
195
+ self.state.update_config(self.config)
196
+
197
+ return self.state