cdk-factory 0.9.6__tar.gz → 0.9.9__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.

Potentially problematic release.


This version of cdk-factory might be problematic. Click here for more details.

Files changed (148) hide show
  1. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/PKG-INFO +1 -1
  2. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/pyproject.toml +1 -1
  3. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/app.py +62 -34
  4. cdk_factory-0.9.9/src/cdk_factory/pipeline/path_utils.py +68 -0
  5. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/pipeline/pipeline_factory.py +8 -42
  6. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/utilities/file_operations.py +11 -0
  7. cdk_factory-0.9.9/src/cdk_factory/version.py +1 -0
  8. cdk_factory-0.9.6/src/cdk_factory/version.py +0 -1
  9. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/.gitignore +0 -0
  10. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/.windsurfrules +0 -0
  11. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/LICENSE +0 -0
  12. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/README.md +0 -0
  13. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/archive/README.md +0 -0
  14. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/archive/migrate_to_enhanced_ssm.py +0 -0
  15. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/examples/json-imports/README.md +0 -0
  16. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/examples/separate-api-gateway/README.md +0 -0
  17. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/examples/separate-api-gateway/api-gateway-stack.json +0 -0
  18. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/examples/separate-api-gateway/config.json +0 -0
  19. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/examples/separate-api-gateway/lambda-stack.json +0 -0
  20. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/mypy.ini +0 -0
  21. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/publish_to_pypi.py +0 -0
  22. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/publish_to_pypi.sh +0 -0
  23. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/pysetup.py +0 -0
  24. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/pysetup.sh +0 -0
  25. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/requirements.dev.txt +0 -0
  26. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/requirements.tests.txt +0 -0
  27. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/requirements.txt +0 -0
  28. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/run-checks.sh +0 -0
  29. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/run-tests-clean-venv.sh +0 -0
  30. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/run-tests.sh +0 -0
  31. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/__init__.py +0 -0
  32. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/builds/README.md +0 -0
  33. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/cdk.json +0 -0
  34. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/cli.py +0 -0
  35. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/commands/command_loader.py +0 -0
  36. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/base_config.py +0 -0
  37. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/cdk_config.py +0 -0
  38. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/deployment.py +0 -0
  39. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/deployment_wave.py +0 -0
  40. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/devops.py +0 -0
  41. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/enhanced_base_config.py +0 -0
  42. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/enhanced_ssm_config.py +0 -0
  43. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/management.py +0 -0
  44. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/pipeline.py +0 -0
  45. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/pipeline_stage.py +0 -0
  46. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/_resources.py +0 -0
  47. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/api_gateway.py +0 -0
  48. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/apigateway_route_config.py +0 -0
  49. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/auto_scaling.py +0 -0
  50. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/cloudfront.py +0 -0
  51. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/cloudwatch_widget.py +0 -0
  52. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/code_artifact.py +0 -0
  53. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/code_artifact_login.py +0 -0
  54. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/code_repository.py +0 -0
  55. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/cognito.py +0 -0
  56. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/docker.py +0 -0
  57. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/dynamodb.py +0 -0
  58. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/ecr.py +0 -0
  59. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/ecs_service.py +0 -0
  60. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/exisiting.py +0 -0
  61. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/lambda_function.py +0 -0
  62. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/lambda_layers.py +0 -0
  63. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/lambda_triggers.py +0 -0
  64. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/load_balancer.py +0 -0
  65. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/rds.py +0 -0
  66. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/resource_mapping.py +0 -0
  67. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/resource_naming.py +0 -0
  68. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/resource_types.py +0 -0
  69. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/route53.py +0 -0
  70. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/route53_hosted_zone.py +0 -0
  71. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/rum.py +0 -0
  72. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/s3.py +0 -0
  73. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/security_group.py +0 -0
  74. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/security_group_full_stack.py +0 -0
  75. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/sqs.py +0 -0
  76. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/resources/vpc.py +0 -0
  77. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/stack.py +0 -0
  78. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/configurations/workload.py +0 -0
  79. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/constructs/cloudfront/cloudfront_distribution_construct.py +0 -0
  80. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/constructs/ecr/ecr_construct.py +0 -0
  81. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/constructs/lambdas/lambda_function_construct.py +0 -0
  82. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/constructs/lambdas/lambda_function_docker_construct.py +0 -0
  83. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/constructs/lambdas/lambda_function_role_construct.py +0 -0
  84. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/constructs/lambdas/policies/policy_docs.py +0 -0
  85. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/constructs/lambdas/policies/policy_statements.py +0 -0
  86. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/constructs/s3_buckets/s3_bucket_construct.py +0 -0
  87. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_destination_construct.py +0 -0
  88. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/constructs/s3_buckets/s3_bucket_replication_source_construct.py +0 -0
  89. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/constructs/sqs/policies/sqs_policies.py +0 -0
  90. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/interfaces/enhanced_ssm_parameter_mixin.py +0 -0
  91. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/interfaces/istack.py +0 -0
  92. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/interfaces/live_ssm_resolver.py +0 -0
  93. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/interfaces/ssm_parameter_mixin.py +0 -0
  94. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/lambdas/health_handler.py +0 -0
  95. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/pipeline/security/policies.py +0 -0
  96. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/pipeline/security/roles.py +0 -0
  97. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/pipeline/stage.py +0 -0
  98. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack/istack.py +0 -0
  99. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack/stack_factory.py +0 -0
  100. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack/stack_module_loader.py +0 -0
  101. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack/stack_module_registry.py +0 -0
  102. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack/stack_modules.py +0 -0
  103. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/__init__.py +0 -0
  104. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/api_gateway/api_gateway_stack.py +0 -0
  105. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/auto_scaling/__init__.py +0 -0
  106. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/auto_scaling/auto_scaling_stack.py +0 -0
  107. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/aws_lambdas/lambda_stack.py +0 -0
  108. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/buckets/README.md +0 -0
  109. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/buckets/bucket_stack.py +0 -0
  110. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/code_artifact/code_artifact_stack.py +0 -0
  111. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/cognito/cognito_stack.py +0 -0
  112. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/dynamodb/dynamodb_stack.py +0 -0
  113. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/ecr/README.md +0 -0
  114. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/ecr/ecr_stack.py +0 -0
  115. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/ecs/__init__.py +0 -0
  116. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/ecs/ecs_service_stack.py +0 -0
  117. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/load_balancer/__init__.py +0 -0
  118. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/load_balancer/load_balancer_stack.py +0 -0
  119. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/rds/__init__.py +0 -0
  120. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/rds/rds_stack.py +0 -0
  121. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/route53/__init__.py +0 -0
  122. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/route53/route53_stack.py +0 -0
  123. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/rum/__init__.py +0 -0
  124. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/rum/rum_stack.py +0 -0
  125. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/security_group/__init__.py +0 -0
  126. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/security_group/security_group_full_stack.py +0 -0
  127. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/security_group/security_group_stack.py +0 -0
  128. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/simple_queue_service/sqs_stack.py +0 -0
  129. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/stack_base.py +0 -0
  130. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/vpc/__init__.py +0 -0
  131. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/vpc/vpc_stack.py +0 -0
  132. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stack_library/websites/static_website_stack.py +0 -0
  133. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/stages/websites/static_website_stage.py +0 -0
  134. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/templates/README.md +0 -0
  135. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/templates/app.py.template +0 -0
  136. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/templates/cdk.json.template +0 -0
  137. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/utilities/api_gateway_integration_utility.py +0 -0
  138. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/utilities/commandline_args.py +0 -0
  139. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/utilities/configuration_loader.py +0 -0
  140. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/utilities/docker_utilities.py +0 -0
  141. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/utilities/environment_services.py +0 -0
  142. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/utilities/git_utilities.py +0 -0
  143. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/utilities/json_loading_utility.py +0 -0
  144. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/utilities/lambda_function_utilities.py +0 -0
  145. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/utilities/os_execute.py +0 -0
  146. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/utils/api_gateway_utilities.py +0 -0
  147. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/cdk_factory/workload/workload_factory.py +0 -0
  148. {cdk_factory-0.9.6 → cdk_factory-0.9.9}/src/handlers/test/handler.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cdk_factory
3
- Version: 0.9.6
3
+ Version: 0.9.9
4
4
  Summary: CDK Factory. A QuickStarter and best practices setup for CDK projects
5
5
  Author-email: Eric Wilson <eric.wilson@geekcafe.com>
6
6
  License: MIT License
@@ -33,7 +33,7 @@ markers = [
33
33
  [project]
34
34
 
35
35
  name = "cdk_factory"
36
- version = "0.9.6"
36
+ version = "0.9.9"
37
37
  authors = [
38
38
  { name="Eric Wilson", email="eric.wilson@geekcafe.com" }
39
39
  ]
@@ -4,14 +4,21 @@ Geek Cafe, LLC
4
4
  Maintainers: Eric Wilson
5
5
  MIT License. See Project Root for the license information.
6
6
  """
7
+ import json
7
8
  import os
9
+ import shutil
10
+ import sys
11
+ import warnings
8
12
  from pathlib import Path
13
+ from typing import Optional
9
14
  import aws_cdk
10
15
  from aws_cdk.cx_api import CloudAssembly
16
+ from aws_lambda_powertools import Logger
11
17
 
12
18
  from cdk_factory.utilities.commandline_args import CommandlineArgs
13
19
  from cdk_factory.workload.workload_factory import WorkloadFactory
14
20
  from cdk_factory.utilities.configuration_loader import ConfigurationLoader
21
+ from cdk_factory.utilities.file_operations import FileOperations
15
22
  from cdk_factory.version import __version__
16
23
 
17
24
 
@@ -30,27 +37,52 @@ class CdkAppFactory:
30
37
  ) -> None:
31
38
 
32
39
  self.args = args or CommandlineArgs()
33
- self.runtime_directory = runtime_directory or str(Path(__file__).parent)
40
+ self.runtime_directory = runtime_directory
34
41
  self.config_path: str | None = config_path
35
42
  self.add_env_context = add_env_context
36
43
  self._is_pipeline = is_pipeline
37
-
38
- # Auto-detect outdir for CodeBuild compatibility
39
- if outdir is None and self.args.outdir is None and auto_detect_project_root:
40
- # For both local dev and CodeBuild: use CDK default (./cdk.out in current directory)
41
- # This ensures CDK CLI can always find the files where it expects them
42
- # CodeBuild buildspec handles artifact collection from the correct location
43
- self.outdir = None
44
-
45
- # Log for transparency
46
- if os.getenv('CODEBUILD_SRC_DIR'):
47
- print(f"📦 CodeBuild detected: using CDK default (./cdk.out)")
48
- print(f" └─ BuildSpec will collect artifacts from correct location")
44
+
45
+ if not self.runtime_directory and auto_detect_project_root:
46
+ self.runtime_directory = FileOperations.caller_app_dir()
47
+
48
+ print(f"📂 Runtime directory: {self.runtime_directory}")
49
+
50
+ # Handle outdir - backward compatible with smart defaults
51
+ supplied_outdir = outdir or (
52
+ self.args.outdir if hasattr(self.args, "outdir") else None
53
+ )
54
+
55
+ if supplied_outdir:
56
+ # If absolute path: use as-is (backward compatible)
57
+ if os.path.isabs(supplied_outdir):
58
+ self.outdir = supplied_outdir
59
+ else:
60
+ # If relative path/name: treat as namespace within /tmp/cdk-factory
61
+ namespace = supplied_outdir.rstrip("/")
62
+ if not namespace or namespace in (".", ".."):
63
+ namespace = "default"
64
+ # TODO: NOT SURE IF WE SHOULD DO THIS
65
+ self.outdir = f"/tmp/cdk-factory/{namespace}/cdk.out"
49
66
  else:
50
- self.outdir = outdir or self.args.outdir
51
-
67
+ # Default: cdk.out relative to runtime_directory (where app.py lives)
68
+ # This ensures CDK CLI can find it when running via cdk.json
69
+ self.outdir = str(Path(self.runtime_directory) / "cdk.out")
70
+
71
+ # Env or CLI still win if you want to honor them:
72
+ env_out = os.getenv("CDK_OUTDIR")
73
+ if env_out:
74
+ self.outdir = os.path.abspath(env_out)
75
+ print(f"[cdk-factory] CDK_OUTDIR override -> {self.outdir}")
76
+
77
+ # Clean and recreate directory for fresh synthesis
78
+ if os.path.exists(self.outdir):
79
+ shutil.rmtree(self.outdir)
80
+ os.makedirs(self.outdir, exist_ok=True)
81
+
52
82
  self.app: aws_cdk.App = aws_cdk.App(outdir=self.outdir)
53
83
 
84
+ print(f"📂 CDK output directory: {self.outdir}")
85
+
54
86
  def synth(
55
87
  self,
56
88
  cdk_app_file: str | None = None,
@@ -64,16 +96,12 @@ class CdkAppFactory:
64
96
  """
65
97
 
66
98
  print(f"👋 Synthesizing CDK App from the cdk-factory version: {__version__}")
67
-
68
- # Log outdir configuration
69
- if self.outdir:
70
- resolved_outdir = str(Path(self.outdir).resolve()) if not os.path.isabs(self.outdir) else self.outdir
71
- print(f"📂 CDK output directory configured: {self.outdir}")
72
- if not os.path.isabs(self.outdir):
73
- print(f" └─ Resolves to: {resolved_outdir}")
74
- else:
75
- print(f"📂 CDK output directory: using CDK default (./cdk.out in current directory)")
76
- print(f" └─ Current directory: {os.getcwd()}")
99
+
100
+ # Log consistent output directory
101
+ print(f"📂 CDK output directory: {self.outdir}")
102
+ print(
103
+ f" └─ Consistent location works in both local and CodeBuild environments"
104
+ )
77
105
 
78
106
  if not paths:
79
107
  paths = []
@@ -108,24 +136,24 @@ class CdkAppFactory:
108
136
  assembly: CloudAssembly = workload.synth()
109
137
 
110
138
  print("☁️ cloud assembly dir", assembly.directory)
111
-
139
+
112
140
  # Validate that the assembly directory exists and has files
113
141
  self._validate_synth_output(assembly)
114
142
 
115
143
  return assembly
116
-
144
+
117
145
  def _validate_synth_output(self, assembly: CloudAssembly) -> None:
118
146
  """
119
147
  Validate that CDK synthesis actually created the expected files.
120
-
148
+
121
149
  Args:
122
150
  assembly: The CloudAssembly returned from synth
123
-
151
+
124
152
  Raises:
125
153
  RuntimeError: If the output directory doesn't exist or is empty
126
154
  """
127
155
  assembly_dir = Path(assembly.directory)
128
-
156
+
129
157
  # Check if directory exists
130
158
  if not assembly_dir.exists():
131
159
  raise RuntimeError(
@@ -134,7 +162,7 @@ class CdkAppFactory:
134
162
  f" Configured outdir: {self.outdir}\n"
135
163
  f" Current directory: {os.getcwd()}"
136
164
  )
137
-
165
+
138
166
  # Check if directory has files
139
167
  files = list(assembly_dir.iterdir())
140
168
  if not files:
@@ -143,7 +171,7 @@ class CdkAppFactory:
143
171
  f" Directory: {assembly_dir}\n"
144
172
  f" This usually means CDK failed to write files."
145
173
  )
146
-
174
+
147
175
  # Check for manifest.json (key CDK file)
148
176
  manifest = assembly_dir / "manifest.json"
149
177
  if not manifest.exists():
@@ -153,13 +181,13 @@ class CdkAppFactory:
153
181
  f" Files found: {[f.name for f in files]}\n"
154
182
  f" CDK may have failed during synthesis."
155
183
  )
156
-
184
+
157
185
  # Success - log details
158
186
  print(f"✅ CDK synthesis successful!")
159
187
  print(f" └─ Output directory: {assembly_dir}")
160
188
  print(f" └─ Files created: {len(files)}")
161
189
  print(f" └─ Stacks: {len(assembly.stacks)}")
162
-
190
+
163
191
  # Log stack names
164
192
  if assembly.stacks:
165
193
  stack_names = [stack.stack_name for stack in assembly.stacks]
@@ -0,0 +1,68 @@
1
+ """
2
+ Pipeline path utility functions.
3
+
4
+ This module contains path conversion utilities used by the pipeline factory.
5
+ Separated from pipeline_factory.py to avoid circular import issues.
6
+ """
7
+ import os
8
+ from pathlib import Path
9
+
10
+
11
+ def convert_app_file_to_relative_directory(cdk_app_file: str) -> str:
12
+ """
13
+ Convert a CDK app.py file path to a relative directory path.
14
+
15
+ CRITICAL: This ensures paths are ALWAYS relative before being baked into the buildspec.
16
+ This prevents:
17
+ 1. Local absolute paths from being baked into CloudFormation templates
18
+ 2. Self-mutate loops due to changing CODEBUILD_SRC_DIR paths
19
+
20
+ Args:
21
+ cdk_app_file: Path to app.py (can be absolute or relative)
22
+
23
+ Returns:
24
+ Relative directory path (e.g., "devops/cdk-iac") or empty string for root
25
+
26
+ Examples:
27
+ >>> convert_app_file_to_relative_directory("/project/devops/cdk-iac/app.py")
28
+ "devops/cdk-iac"
29
+
30
+ >>> convert_app_file_to_relative_directory("devops/cdk-iac/app.py")
31
+ "devops/cdk-iac"
32
+
33
+ >>> convert_app_file_to_relative_directory("/project/app.py")
34
+ ""
35
+ """
36
+ cdk_app_file_path = Path(cdk_app_file)
37
+
38
+ # If absolute path, try to make it relative
39
+ if cdk_app_file_path.is_absolute():
40
+ # Check if we have a project root hint (CODEBUILD_SRC_DIR or current working directory)
41
+ codebuild_src = os.getenv('CODEBUILD_SRC_DIR')
42
+ base_dir = codebuild_src if codebuild_src else os.getcwd()
43
+
44
+ try:
45
+ # Resolve symlinks (important for macOS where /var -> /private/var)
46
+ resolved_file = str(Path(cdk_app_file_path).resolve())
47
+ resolved_base = str(Path(base_dir).resolve())
48
+
49
+ # Make it relative to base directory
50
+ rel_path = os.path.relpath(resolved_file, resolved_base)
51
+ # If we ended up going outside (../), that's probably wrong
52
+ if not rel_path.startswith('..'):
53
+ cdk_app_file_path = Path(rel_path)
54
+ except ValueError:
55
+ # Different drives on Windows - can't make relative
56
+ pass
57
+
58
+ # Remove /app.py to get directory
59
+ cdk_directory = str(cdk_app_file_path.parent if cdk_app_file_path.name == 'app.py' else cdk_app_file_path.parent)
60
+
61
+ # Normalize to use forward slashes (works on Windows and Linux)
62
+ cdk_directory = cdk_directory.replace('\\', '/')
63
+
64
+ # If it's just '.' (current directory), use empty string
65
+ if cdk_directory in ('.', './'):
66
+ cdk_directory = ""
67
+
68
+ return cdk_directory
@@ -26,11 +26,12 @@ from cdk_factory.workload.workload_factory import WorkloadConfig
26
26
  from cdk_factory.configurations.cdk_config import CdkConfig
27
27
  from cdk_factory.configurations.pipeline_stage import PipelineStageConfig
28
28
  from cdk_factory.interfaces.istack import IStack
29
+ from cdk_factory.pipeline.path_utils import convert_app_file_to_relative_directory
29
30
 
30
31
  logger = Logger()
31
32
 
32
33
 
33
- class PipelineFactoryStack(cdk.Stack):
34
+ class PipelineFactoryStack(IStack):
34
35
  """
35
36
  Pipeline Stacks wrap up your application for a CI/CD pipeline Stack
36
37
  """
@@ -355,51 +356,16 @@ class PipelineFactoryStack(cdk.Stack):
355
356
  def _get_synth_shell_step(self) -> pipelines.ShellStep:
356
357
  if not self.workload.cdk_app_file:
357
358
  raise ValueError("CDK app file is not defined")
358
- cdk_directory = self.workload.cdk_app_file.removesuffix("/app.py")
359
359
 
360
360
  build_commands = self._get_build_commands()
361
361
 
362
- # Calculate where cdk.out will be created relative to project root
363
- # The build commands cd into cdk_directory and create ./cdk.out there
364
- # We need to tell the pipeline where to find those artifacts
365
- import os
366
- from pathlib import Path
367
-
368
- # Get the directory portion of cdk_app_file
369
- cdk_dir_path = Path(cdk_directory)
370
-
371
- # If we have CODEBUILD_SRC_DIR, use it as the base to calculate relative path
372
- codebuild_src = os.getenv('CODEBUILD_SRC_DIR')
373
-
374
- if codebuild_src and cdk_dir_path.is_absolute():
375
- # Calculate relative path from CodeBuild source directory
376
- # Example: /codebuild/.../src/devops/cdk-iac relative to /codebuild/.../src = devops/cdk-iac
377
- try:
378
- cdk_relative_dir = os.path.relpath(str(cdk_dir_path), codebuild_src)
379
- # If relpath resulted in going up directories (starts with ..), use empty
380
- # If relpath is '.' (same directory), use empty (app.py at root)
381
- if cdk_relative_dir.startswith('..') or cdk_relative_dir == '.':
382
- cdk_relative_dir = ""
383
- except ValueError:
384
- # Paths on different drives (Windows) - fallback to empty
385
- cdk_relative_dir = ""
386
- elif cdk_dir_path.is_absolute():
387
- # No CODEBUILD_SRC_DIR but path is absolute - can't determine relative path reliably
388
- # Fallback to empty (will use "cdk.out" at root)
389
- cdk_relative_dir = ""
390
- else:
391
- # Path is already relative - use as-is
392
- cdk_relative_dir = str(cdk_dir_path)
393
-
394
- # Construct the path to cdk.out relative to project root
395
- if cdk_relative_dir:
396
- cdk_out_directory = f"{cdk_relative_dir}/cdk.out"
397
- else:
398
- cdk_out_directory = "cdk.out"
362
+ # Use consistent /tmp/cdk-factory/cdk.out location
363
+ # This matches the output directory configured in CdkAppFactory
364
+ cdk_out_directory = "/tmp/cdk-factory/cdk.out"
399
365
 
400
- build_commands.append(f"echo 👉 cdk_directory: {cdk_directory}")
401
- build_commands.append(f"echo 👉 cdk_out_directory: {cdk_out_directory}")
402
- build_commands.append("echo 👉 PWD from synth shell step: ${PWD}")
366
+ # Debug logging - will be baked into buildspec
367
+ build_commands.append(f"echo '👉 CDK output directory: {cdk_out_directory}'")
368
+ build_commands.append("echo '👉 Consistent location in all environments'")
403
369
 
404
370
  shell = pipelines.ShellStep(
405
371
  "CDK Synth",
@@ -6,6 +6,7 @@ MIT License. See Project Root for the license information.
6
6
 
7
7
  import os
8
8
  import shutil
9
+ import inspect
9
10
  import zipfile
10
11
  from typing import List
11
12
  from pathlib import Path
@@ -277,3 +278,13 @@ class FileOperations:
277
278
  return sub_dir
278
279
 
279
280
  return None
281
+
282
+ @staticmethod
283
+ def caller_app_dir(default: str = ".") -> str:
284
+ # frame[0] is this function; frame[1] is the factory; frame[2] should be app.py
285
+ for frame_info in inspect.stack():
286
+ # first non-package frame likely belongs to app.py
287
+ candidate = os.path.abspath(os.path.dirname(frame_info.filename))
288
+ if "site-packages" not in candidate and "dist-packages" not in candidate:
289
+ return candidate
290
+ return os.path.abspath(default)
@@ -0,0 +1 @@
1
+ __version__ = "0.9.9"
@@ -1 +0,0 @@
1
- __version__ = "0.9.6"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes