8000 Ensure Logs Level is Validated in All Subcommands, Ensure Version Check Uses `GITHUB_TOKEN` by Cerebrovinny · Pull Request #957 · cloudposse/atmos · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Ensure Logs Level is Validated in All Subcommands, Ensure Version Check Uses GITHUB_TOKEN #957

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 90 commits into from

Conversation

Cerebrovinny
Copy link
Collaborator
@Cerebrovinny Cerebrovinny commented Jan 19, 2025

what

  • Fixed error message consistency for invalid log level validation
  • Updated test cases
  • Fixed test case where empty directory not empty
  • Introduced new clean flag to remove untracked files before running tests in workdir

Evidence:
CleanShot 2025-01-19 at 18 43 44

wrong/invalid flag passed:
CleanShot 2025-01-19 at 17 33 37

Env variable invalid:
CleanShot 2025-01-19 at 17 31 02

why

Improved error messages
Better output clarity when theres an issue on the ATMOS_LOGS_LEVEL as env variable or when it's passed as a flag

references

Summary by CodeRabbit

  • New Features
    • Enhanced CLI update notifications, help outputs, and version checks.
    • Added options for comprehensive logging, caching, and configuration management.
    • Introduced new environment variables for configuration management in YAML files.
  • Bug Fixes
    • Refined error messages and debug outputs for clearer user feedback.
  • Documentation
    • Updated help texts and user guides to reflect new behavior and usage.
    • Added README files for new Terraform components and modules.
  • Tests
    • Introduced timeout and cleanup settings, improving reliability of test cases.
    • Enhanced test cases with new configurations and expected outputs.

@Cerebrovinny Cerebrovinny requested a review from osterman January 19, 2025 17:55
@Cerebrovinny Cerebrovinny marked this pull request as ready for review January 19, 2025 17:55
@Cerebrovinny Cerebrovinny requested a review from a team as a code owner January 19, 2025 17:55
@mergify mergify bot added the triage Needs triage label Jan 19, 2025
Copy link
Contributor
coderabbitai bot commented Jan 19, 2025
📝 Walkthrough

Walkthrough

This pull request enhances Atmos’s logging, error handling, and configuration management. The changes improve the version update checking flow by adding detailed debug logs and refining the GitHub release retrieval process. Additionally, adjustments in logging configuration and output formatting have been made. Multiple test cases now include timeouts, clean-up options, and updated expected messages. New test fixture files and Terraform module configurations are also introduced to bolster infrastructure testing and documentation.

Changes

File(s) Change Summary
cmd/cmd_utils.go, cmd/version.go, pkg/utils/github_utils.go Refactored version update checking with added debug logs, refined error messages, and simplified GitHub release retrieval.
pkg/config/utils.go, pkg/logger/logger.go Enhanced logging configuration handling and output formatting (e.g., permission syntax update and newline removal in error messages).
pkg/config/cache.go Added new fields (CacheFile, CacheDir) and updated GetCacheFilePath signature with improved error reporting.
tests/cli_test.go, tests/test-cases/.yaml, tests/snapshots/.golden, Makefile, .github/workflows/test.yml Introduced timeouts, clean options, and updated expected outputs across test cases; increased test timeouts for acceptance tests in Makefile and workflow definitions.
tests/fixtures/**/* Added new fixture files, Terraform modules, and README documentation to improve test coverage and module configuration.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant VersionCmd
    participant UpdateChecker
    participant GitHub

    User->>VersionCmd: Run version command (checkFlag true)
    VersionCmd->>UpdateChecker: Call CheckForAtmosUpdateAndPrintMessage
    UpdateChecker->>GitHub: Invoke GetLatestGitHubRepoRelease
    GitHub-->>UpdateChecker: Return latest release tag (or error)
    UpdateChecker->>VersionCmd: Log debug info and update status
    VersionCmd->>User: Display version and update messages
Loading

Possibly related PRs

  • fix check the version if config broken #735: The changes in the main PR, specifically the modifications to the CheckForAtmosUpdateAndPrintMessage function in cmd/cmd_utils.go, are related to the new isVersionCommand function introduced in the retrieved PR, as both involve handling version-related functionality within the Atmos CLI.
  • fix log level priorty #1031: The changes in the main PR, which enhance logging and error handling in the CheckForAtmosUpdateAndPrintMessage function, are related to the modifications in the retrieved PR that focus on prioritizing log levels and improving logging configuration handling in the CLI, particularly through the introduction of new test cases for log level validation.
  • Logs validation on root level #946: The changes in the main PR, which enhance logging and error handling in the CheckForAtmosUpdateAndPrintMessage function, are related to the retrieved PR that implements logs validation at the root level, as both involve modifications to logging configurations and error handling in the command execution context.

Suggested reviewers

  • osterman
  • aknysh
✨ Finishing Touches
  • 📝 Generate Docstrings (Beta)

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary or @auto-summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai or @auto-title anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor
@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
cmd/cmd_utils.go (1)

498-512: Fix typo in error message while maintaining good debug logging.

The added debug logging enhances observability, but there's a grammatical error in the error message.

Fix the typo in the error message:

-u.LogWarning(atmosConfig, fmt.Sprintf("Unable not load cache: %s", err))
+u.LogWarning(atmosConfig, fmt.Sprintf("Unable to load cache: %s", err))
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b8f480f and fc3adfa.

📒 Files selected for processing (4)
  • cmd/cmd_utils.go (2 hunks)
  • cmd/root.go (1 hunks)
  • cmd/version.go (3 hunks)
  • pkg/config/utils.go (2 hunks)
🧰 Additional context used
📓 Learnings (1)
cmd/cmd_utils.go (1)
Learnt from: Listener430
PR: cloudposse/atmos#844
File: cmd/version.go:34-44
Timestamp: 2024-12-13T15:28:13.630Z
Learning: In `cmd/version.go`, when handling the `--check` flag in the `versionCmd`, avoid using `CheckForAtmosUpdateAndPrintMessage(cliConfig)` as it updates the cache timestamp, which may not be desired in this context.
⏰ Context from checks skipped due to timeout of 90000ms (20)
  • GitHub Check: [mock-macos] tests/fixtures/scenarios/complete
  • GitHub Check: [mock-macos] examples/demo-vendoring
  • GitHub Check: [mock-macos] examples/demo-context
  • GitHub Check: [mock-macos] examples/demo-component-versions
  • GitHub Check: [mock-windows] tests/fixtures/scenarios/complete
  • GitHub Check: [mock-windows] examples/demo-vendoring
  • GitHub Check: [mock-windows] examples/demo-context
  • GitHub Check: [mock-windows] examples/demo-component-versions
  • GitHub Check: [mock-windows] examples/demo-atlantis
  • GitHub Check: [mock-linux] tests/fixtures/scenarios/complete
  • GitHub Check: [mock-linux] examples/demo-vendoring
  • GitHub Check: Acceptance Tests (macos-latest, macos)
  • GitHub Check: [mock-linux] examples/demo-context
  • GitHub Check: Acceptance Tests (windows-latest, windows)
  • GitHub Check: Acceptance Tests (ubuntu-latest, linux)
  • GitHub Check: [lint] quick-start-advanced
  • GitHub Check: [localstack] demo-localstack
  • GitHub Check: Docker Lint
  • GitHub Check: [k3s] demo-helmfile
  • GitHub Check: Summary
🔇 Additional comments (7)
cmd/version.go (3)

26-40: Well-structured initialization of log level configuration!

The code properly validates the log level from command line flags before initializing the configuration, following good error handling practices.


54-75: Consider the impact of cache updates during version checks.

While the added debug logging improves observability, be cautious about using CheckForAtmosUpdateAndPrintMessage in this context as it updates the cache timestamp, which might not be desired here.

Consider separating the version check logic from cache updates to maintain better control over when the cache is modified.


81-82: Good addition of debug logging!

The debug message clearly indicates that updates are being checked from the cache, improving observability.

cmd/root.go (1)

65-70: Excellent improvement to error handling!

The code now intelligently suppresses unnecessary warnings during help requests while maintaining proper error handling for other scenarios. This enhances the user experience.

cmd/cmd_utils.go (1)

535-536: Good addition of status logging!

The debug message clearly indicates when Atmos is up to date, improving observability.

pkg/config/utils.go (2)

364-364: Excellent improvement to error messaging!

The error message now clearly indicates both the invalid value and the valid options, making it easier for users to correct their input.


489-489: Great consistency in error messaging!

The error message for command line flags matches the style used for environment variables, maintaining a consistent user experience.

coderabbitai[bot]
coderabbitai bot previously approved these changes Jan 19, 2025
@mergify mergify bot removed the triage Needs triage label Jan 19, 2025
@mergify mergify bot added the triage Needs triage label Jan 19, 2025
@Cerebrovinny Cerebrovinny force-pushed the logs-improvements-part2 branch from 6c00f9d to 59b899d Compare January 19, 2025 18:45
Copy link
Contributor
@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (2)
pkg/utils/github_utils.go (1)

34-35: Consider using authenticated client for better rate limits.

The change to use an unauthenticated client might lead to GitHub API rate limiting. Consider using the existing newGitHubClient function which handles authentication.

-client := github.NewClient(nil)
+client := newGitHubClient(context.Background())
cmd/version.go (1)

56-65: Simplify error handling logic.

The error handling contains redundant checks and could be simplified.

-			latestReleaseTag, err := u.GetLatestGitHubRepoRelease(atmosConfig, "cloudposse", "atmos")
-			if err == nil && latestReleaseTag != "" {
-				if err != nil {
-					u.LogWarning(atmosConfig, fmt.Sprintf("Failed to check for updates: %v", err))
-					return
-				}
-				if latestReleaseTag == "" {
-					u.LogWarning(atmosConfig, "No release information available")
-					return
-				}
+			latestReleaseTag, err := u.GetLatestGitHubRepoRelease(atmosConfig, "cloudposse", "atmos")
+			if err != nil {
+				u.LogWarning(atmosConfig, fmt.Sprintf("Failed to check for updates: %v", err))
+				return
+			}
+			if latestReleaseTag == "" {
+				u.LogWarning(atmosConfig, "No release information available")
+				return
+			}
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fc3adfa and 59b899d.

📒 Files selected for processing (7)
  • cmd/cmd_utils.go (2 hunks)
  • cmd/root.go (1 hunks)
  • cmd/version.go (4 hunks)
  • pkg/config/utils.go (2 hunks)
  • pkg/utils/github_utils.go (2 hunks)
  • pkg/utils/log_utils.go (1 hunks)
  • tests/test-cases/log-level-validation.yaml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • cmd/root.go
  • cmd/cmd_utils.go
  • pkg/config/utils.go
⏰ Context from checks skipped due to timeout of 90000ms (5)
  • GitHub Check: [localstack] demo-localstack
  • GitHub Check: Acceptance Tests (macos-latest, macos)
  • GitHub Check: Acceptance Tests (windows-latest, windows)
  • GitHub Check: Acceptance Tests (ubuntu-latest, linux)
  • GitHub Check: Summary
🔇 Additional comments (5)
pkg/utils/log_utils.go (1)

82-82: LGTM! Improved debug message clarity.

Adding the "[DEBUG]" prefix makes it easier to identify debug level messages in logs.

tests/test-cases/log-level-validation.yaml (1)

34-34: LGTM! Test case updated to match new error message format.

The test case now properly validates the improved error message that includes the environment variable context.

cmd/version.go (3)

26-40: LGTM! Proper initialization of logging configuration.

The initialization of atmosConfig with log level from flags is well-structured and includes proper error handling.


69-71: LGTM! Clear debug logging.

The debug logging statements provide good visibility into the version comparison process.


82-83: LGTM! Added debug logging for cache check.

Good addition of debug logging before checking for updates from cache.

coderabbitai[bot]
coderabbitai bot previously approved these changes Jan 19, 2025
@mergify mergify bot removed the triage Needs triage label Jan 19, 2025
@mergify mergify bot added the triage Needs triage label Jan 20, 2025
coderabbitai[bot]
coderabbitai bot previously approved these changes Jan 20, 2025
@mergify mergify bot removed the triage Needs triage label Jan 20, 2025
@Cerebrovinny Cerebrovinny requested a review from aknysh January 20, 2025 11:34
@osterman
Copy link
Member

LGTM, tested locally. Just address the suggestions and we're good to merge.

@osterman osterman added the patch A minor, backward compatible change label Jan 20, 2025
@osterman osterman changed the title Logs improvements part2 Ensure Logs Level is Validated in All Subcommands Jan 20, 2025
coderabbitai[bot]
coderabbitai bot previously approved these changes Jan 20, 2025
mcalhoun and others added 16 commits February 9, 2025 21:42
* all artifactory to use anonymous

* [autofix.ci] apply automated fixes

* Update website/docs/core-concepts/projects/configuration/stores.mdx

Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <erik@cloudposse.com>

* Update website/docs/core-concepts/projects/configuration/stores.mdx

Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <erik@cloudposse.com>

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <erik@cloudposse.com>
* restore hooks functionality
* [autofix.ci] apply automated fixes

* Update main_test.go

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* [autofix.ci] apply automated fixes

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* sanitize snapshots

* [autofix.ci] apply automated fixes

* check for empty repo root

* normalize slashes

* normalize slashes

* try to fix windows snapshots with windows paths

* handle multiple slashes

* handle multiple slashes

* changed strategy for removing double slashes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* allow user to specify default value when using store

* Update internal/exec/yaml_func_store_test.go

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* allow user to specify default value when using store

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* allow user to specify default value when using store

* Update internal/exec/yaml_func_store_test.go

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* allow user to specify default value when using store

* fix typo in Redis store error message

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
…atmos terraform` commands that require it (#1023)

* updates

* updates

* updates

* updates
* fix(vendor): Remove excessive URL validation

Fixes #1019

* feat(vendor): Add component to error message

---------

Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <erik@cloudposse.com>
* sanitize snapshots

* [autofix.ci] apply automated fixes

* check for empty repo root

* normalize slashes

* normalize slashes

* try to fix windows snapshots with windows paths

* handle multiple slashes

* handle multiple slashes

* changed strategy for removing double slashes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
* properly handle stdout, stderr, and null

* update snapshots

* fix test
* fix log level priorty

* fix unwanted flag being set

* add tests for log level priority

* added todo comment with more clearity

* Add tests for logs-file

* update comment
@mergify mergify bot removed the conflict This PR has conflicts label Feb 9, 2025
Copy link
Contributor
@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

♻️ Duplicate comments (1)
tests/cli_test.go (1)

901-901: ⚠️ Potential issue

Fix incorrect path in error message.

The error message for stderr mismatch incorrectly references stdout path.

-t.Errorf("Stderr diff mismatch for %q:\n%s", stdoutPath, diff)
+t.Errorf("Stderr diff mismatch for %q:\n%s", stderrPath, diff)
🧹 Nitpick comments (27)
tests/cli_terraform_test.go (2)

163-191: Consider enhancing error handling in the new initialization function.

The new runTerraformInit function is well-structured with good logging, but could benefit from more robust error handling.

Consider adding timeouts and context handling:

 func runTerraformInit(t *testing.T, binaryPath, environment string) {
+    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
+    defer cancel()
-    cmd := exec.Command(binaryPath, "terraform", "init", "mock", "-s", environment)
+    cmd := exec.CommandContext(ctx, binaryPath, "terraform", "init", "mock", "-s", environment)

     // ... rest of the function ...

     err := cmd.Run()
+    if ctx.Err() == context.DeadlineExceeded {
+        t.Fatalf("Terraform init timed out after 5 minutes for environment %s", environment)
+    }
     if err != nil {
         t.Fatalf("Failed to run terraform init mock -s %s: %v\nStdout: %s\nStderr: %s",
             environment, err, stdout.String(), stderr.String())
     }
 }

167-174: Consider making environment variables configurable.

The environment variables are currently hardcoded in the initialization function. Consider making them configurable for better test flexibility.

Consider extracting them to a configuration struct:

type TerraformInitConfig struct {
    RunReconfigure bool
    RunInit       bool
    LogLevel      string
    LogFile       string
}

func runTerraformInit(t *testing.T, binaryPath, environment string, config TerraformInitConfig) {
    envVars := os.Environ()
    if config.RunReconfigure {
        envVars = append(envVars, "ATMOS_COMPONENTS_TERRAFORM_INIT_RUN_RECONFIGURE=true")
    }
    if config.RunInit {
        envVars = append(envVars, "ATMOS_COMPONENTS_TERRAFORM_DEPLOY_RUN_INIT=true")
    }
    envVars = append(envVars,
        fmt.Sprintf("ATMOS_LOGS_LEVEL=%s", config.LogLevel),
        fmt.Sprintf("ATMOS_LOGS_FILE=%s", config.LogFile))
    // ... rest of the function
}
tests/fixtures/scenarios/vendor/components/terraform/test-components/main/README.md (1)

1-14: Documentation Enhancement: Clear and Informative.
The new README section thoroughly explains the purpose and usage of the Terraform IPinfo component. One small nitpick: consider adding a period at the end of the output bullet item for consistent punctuation.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~13-~13: Loose punctuation mark.
Context: ...empty string. ### Outputs - metadata: The data retrieved from IPinfo for the ...

(UNLIKELY_OPENING_PUNCTUATION)

tests/fixtures/atmos.yaml (1)

31-34: Remove Trailing Whitespace and Add Newline at EOF

The logs section is correctly configured, but YAML lint reports trailing spaces at the end of line 34 and a missing newline at the end of the file. To satisfy YAML formatting standards, please remove the extra space on line 34 and ensure a newline is added at the end of the file.

Proposed fix:

-  color: true 
+  color: true

(Also ensure that the file ends with a newline.)

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 34-34: no new line character at the end of file

(new-line-at-end-of-file)


[error] 34-34: trailing spaces

(trailing-spaces)

tests/fixtures/scenarios/vendor/components/terraform/github/stargazers/main/README.md (1)

1-14: Comprehensive and Clear Documentation
The README introduces the module well, explaining its purpose, inputs, and outputs. Consider revisiting the punctuation in the list items (specifically on lines 9 and 13) to ensure maximum clarity and consistency in the documentation.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~9-~9: Loose punctuation mark.
Context: ...y. ## Usage ### Inputs - repository: The GitHub repository in the format 'ow...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~13-~13: Loose punctuation mark.
Context: ...epo'. ### Outputs - stargazers_count: The number of stargazers for the specif...

(UNLIKELY_OPENING_PUNCTUATION)

tests/fixtures/README.md (1)

7-17: Specify a language for the fenced code block.
The directory structure code block (lines 7–17) does not specify a language, which triggers markdown linting warnings (MD040). Specifying a language—such as “text”—will improve readability and help avoid static analysis issues.

-```
+```text
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

7-7: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)

tests/fixtures/scenarios/mock-terraform/stacks/catalog/terraform/mock.yaml (1)

13-13: Fix YAML Formatting: Trailing Spaces and Missing Newline

Static analysis noted trailing spaces on line 13 and a missing newline at the end of the file. Please remove the extra whitespace and add a newline to tidy up the file.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 13-13: no new line character at the end of file

(new-line-at-end-of-file)


[error] 13-13: trailing spaces

(trailing-spaces)

tests/fixtures/scenarios/mock-terraform/stacks/dev/mock.yaml (1)

16-18: Improve YAML Formatting: Remove Trailing Spaces and Ensure Newline

Static analysis has flagged trailing spaces in the last line and a missing newline at the end of the file. Removing these will help keep the YAML formatted properly.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 18-18: no new line character at the end of file

(new-line-at-end-of-file)


[error] 18-18: trailing spaces

(trailing-spaces)

tests/fixtures/scenarios/mock-terraform/stacks/prod/mock.yaml (1)

16-18: Address YAML Formatting Issues

As with the other YAML files, please fix the trailing spaces on line 18 and ensure a newline exists at the end of the file to comply with linting guidelines.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 18-18: no new line character at the end of file

(new-line-at-end-of-file)


[error] 18-18: trailing spaces

(trailing-spaces)

tests/fixtures/scenarios/mock-terraform/atmos.yaml (1)

23-25: Review Logging Configuration

The logs section is set to output to “/dev/stderr” with a log level of “Info.” Please verify that this log level aligns with your updated log validation logic. Also, consider if converting error messages (or log outputs) to markdown format might further enhance the CLI consistency as discussed in the PR.

tests/fixtures/scenarios/mock-terraform/components/terraform/mock/main.tf (2)

1-27: Add Descriptions for Variables
All variable declarations are clear and follow a consistent pattern. For future maintainability and better documentation, consider adding a description attribute to each variable. This is particularly useful for users to understand the expected values (especially for required variables such as "stage", "environment", and "tenant"), and for clarity on the purpose of variables with default values ("foo", "bar", "baz").

A suggested diff snippet:

 variable "stage" {
   type = string
+  description = "The deployment stage (eg. dev, prod)"
 }

41-64: Enhance Outputs with Descriptions
The outputs for "foo", "bar", "baz", "stage", "environment", and "tenant" are correctly defined and provide direct access to their corresponding variables. For improved clarity and self-documentation, consider adding a description attribute to each output. This small addition can enhance the consistency and usability of the configuration in broader contexts.

A suggested diff snippet for one output:

 output "foo" {
-  value = var.foo
+  description = "The value of variable foo"
+  value = var.foo
 }
tests/fixtures/components/terraform/myapp/cache.nonprod.txt (1)

3-3: Text styling suggestion for weather condition:
The solitary "Overcast" line sets the scene nicely. However, note that a static analysis hint mentioned a possibly missing punctuation mark. If the intended style benefits from a trailing punctuation mark for clarity or consistency, consider adding one—but if the visual layout is intentional, feel free to ignore this note.

tests/fixtures/scenarios/vendor/components/terraform/weather/main/providers.tf (1)

1-2: HTTP Provider Block Declaration
The new empty provider block for "http" is correctly added. If no special configuration is required, this minimal declaration is acceptable. Consider adding a brief comment to remind future maintainers that configuration can be added if needed.

tests/fixtures/scenarios/vendor/components/terraform/weather/main/main.tf (1)

11-16: HTTP Data Source Configuration
The data block for the HTTP request is configured correctly using the constructed URL and sets a custom User-Agent header to "curl". As an enhancement, you might consider parameterizing the User-Agent header in the future to allow for flexibility.

tests/fixtures/scenarios/vendor/components/terraform/vpc-src/main.tf (1)

1-9: Duplicate Local URL Construction
This locals block replicates the URL construction logic seen in the weather component. While the code is correct, you might later consider abstracting this common functionality into a reusable module to avoid duplication across components.

tests/fixtures/scenarios/vendor/components/terraform/weather/main/variables.tf (1)

1-35: Overall Review: Terraform Variables are Well-Defined

The new variables (stage, location, options, format, lang, and units) are defined with clear types and default values. One small suggestion: the description for "location" (lines 6–10) could be more explicit—for example, clarifying that it refers to where the weather forecast is retrieved.

Suggested diff:

-  description = "Location for which the weather."
+  description = "Location for which the weather forecast is retrieved."
tests/fixtures/scenarios/vendor/components/terraform/vpc-src/variables.tf (1)

1-35: Overall Review: Consistency Across Modules

The variable definitions here mirror those in the weather module, which is great for consistency. As with the previous file, consider updating the "location" description (lines 6–10) to more clearly explain its purpose.

Suggested diff:

-  description = "Location for which the weather."
+  description = "Location for which the weather forecast is retrieved."
tests/fixtures/scenarios/vendor/components/terraform/vpc-src/README.md (1)

1-51: Documentation Review: VPC Source Module README

This README explains the module’s functionality clearly, with useful usage examples in YAML. In the Inputs section, consider a slight rewording to improve clarity. For example, on line 34, updating the "location" description to include a definite article and a clearer reference to weather information would be beneficial.
[typographical]

Suggested diff for line 34:

- - `location`: Location for which the weather is reported. Default is "Los Angeles".
+ - `location`: The location for which weather information is reported. Default is "Los Angeles".
🧰 Tools
🪛 LanguageTool

[typographical] ~3-~3: Consider using typographic quotation marks here.
Context: ...aform Weather Component This Terraform "root" module fetches weather information for ...

(EN_QUOTES)


[uncategorized] ~9-~9: You might be missing the article “an” here.
Context: ...ch weather updates for a location using HTTP request. - Write the obtained weather d...

(AI_EN_LECTOR_MISSING_DETERMINER_AN)


[uncategorized] ~34-~34: Loose punctuation mark.
Context: ... where it will be deployed. - location: Location for which the weather is repor...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~34-~34: A determiner appears to be missing. Consider inserting it.
Context: ...tion for which the weather is reported. Default is "Los Angeles". - options: Options ...

(AI_EN_LECTOR_MISSING_DETERMINER)


[typographical] ~34-~34: Consider using typographic quotation marks here.
Context: ...ich the weather is reported. Default is "Los Angeles". - options: Options to customize the ...

(EN_QUOTES)


[uncategorized] ~35-~35: Loose punctuation mark.
Context: ...d. Default is "Los Angeles". - options: Options to customize the output. Defaul...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~35-~35: A determiner appears to be missing. Consider inserting it.
Context: ...ions: Options to customize the output. Default is "0T". - format`: Specifies the outp...

(AI_EN_LECTOR_MISSING_DETERMINER)


[typographical] ~35-~35: Consider using a typographic opening quote here.
Context: ...ons to customize the output. Default is "0T". - format: Specifies the output fo...

(EN_QUOTES)


[typographical] ~35-~35: Consider using a typographic close quote here.
Context: ... to customize the output. Default is "0T". - format: Specifies the output forma...

(EN_QUOTES)


[uncategorized] ~36-~36: Loose punctuation mark.
Context: ... the output. Default is "0T". - format: Specifies the output format. Default is...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~36-~36: A determiner appears to be missing. Consider inserting it.
Context: ... format: Specifies the output format. Default is "v2". - lang: Language in which th...

(AI_EN_LECTOR_MISSING_DETERMINER)


[typographical] ~36-~36: Consider using a typographic opening quote here.
Context: ...Specifies the output format. Default is "v2". - lang: Language in which the wea...

(EN_QUOTES)


[typographical] ~36-~36: Consider using a typographic close quote here.
Context: ...cifies the output format. Default is "v2". - lang: Language in which the weathe...

(EN_QUOTES)


[uncategorized] ~37-~37: Loose punctuation mark.
Context: ...output format. Default is "v2". - lang: Language in which the weather will be d...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~37-~37: A determiner appears to be missing. Consider inserting it.
Context: ...in which the weather will be displayed. Default is "en". - units: Units in which the ...

(AI_EN_LECTOR_MISSING_DETERMINER)


[typographical] ~37-~37: Consider using typographic quotation marks here.
Context: ...e weather will be displayed. Default is "en". - units: Units in which the weather ...

(EN_QUOTES)


[uncategorized] ~38-~38: Loose punctuation mark.
Context: ...be displayed. Default is "en". - units: Units in which the weather will be disp...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~38-~38: A determiner appears to be missing. Consider inserting it.
Context: ...in which the weather will be displayed. Default is "m". ### Outputs - weather: The f...

(AI_EN_LECTOR_MISSING_DETERMINER)


[typographical] ~38-~38: Consider using typographic quotation marks here.
Context: ...e weather will be displayed. Default is "m". ### Outputs - weather: The fetched ...

(EN_QUOTES)


[uncategorized] ~42-~42: Loose punctuation mark.
Context: ...ther: The fetched weather data. - url: Requested URL. - stage`: Stage of depl...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~43-~43: Loose punctuation mark.
Context: ... data. - url: Requested URL. - stage: Stage of deployment. - location: Loca...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~44-~44: Loose punctuation mark.
Context: ...tage: Stage of deployment. - location: Location of the reported weather. - la...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~45-~45: Loose punctuation mark.
Context: ...cation of the reported weather. - lang: Language used for weather data. - `unit...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~46-~46: Loose punctuation mark.
Context: ...anguage used for weather data. - units: Units of measurement for the weather da...

(UNLIKELY_OPENING_PUNCTUATION)

tests/fixtures/scenarios/vendor/components/terraform/weather/main/README.md (1)

1-51: Documentation Review: Weather Module README

This README effectively outlines the module’s features, usage, and outputs. The description is detailed and the YAML example is very helpful. For stylistic consistency, consider using typographic quotation marks (e.g. for “root” in line 3) and a similar clarification of the Inputs section. For instance, on line 34, adjusting the "location" description to read more clearly would further enhance the document.
[typographical]

Suggested diff for line 34:

- - `location`: Location for which the weather is reported. Default is "Los Angeles".
+ - `location`: The location for which weather information is reported. Default is "Los Angeles".
🧰 Tools
🪛 LanguageTool

[typographical] ~3-~3: Consider using typographic quotation marks here.
Context: ...aform Weather Component This Terraform "root" module fetches weather information for ...

(EN_QUOTES)


[uncategorized] ~34-~34: Loose punctuation mark.
Context: ... where it will be deployed. - location: Location for which the weather is repor...

(UNLIKELY_OPENING_PUNCTUATION)


[typographical] ~34-~34: Consider using typographic quotation marks here.
Context: ...ich the weather is reported. Default is "Los Angeles". - options: Options to customize the ...

(EN_QUOTES)


[uncategorized] ~35-~35: Loose punctuation mark.
Context: ...d. Default is "Los Angeles". - options: Options to customize the output. Defaul...

(UNLIKELY_OPENING_PUNCTUATION)


[typographical] ~35-~35: Consider using a typographic opening quote here.
Context: ...ons to customize the output. Default is "0T". - format: Specifies the output fo...

(EN_QUOTES)


[typographical] ~35-~35: Consider using a typographic close quote here.
Context: ... to customize the output. Default is "0T". - format: Specifies the output forma...

(EN_QUOTES)< F438 /p>


[uncategorized] ~36-~36: Loose punctuation mark.
Context: ... the output. Default is "0T". - format: Specifies the output format. Default is...

(UNLIKELY_OPENING_PUNCTUATION)


[typographical] ~36-~36: Consider using a typographic opening quote here.
Context: ...Specifies the output format. Default is "v2". - lang: Language in which the wea...

(EN_QUOTES)


[typographical] ~36-~36: Consider using a typographic close quote here.
Context: ...cifies the output format. Default is "v2". - lang: Language in which the weathe...

(EN_QUOTES)


[uncategorized] ~37-~37: Loose punctuation mark.
Context: ...output format. Default is "v2". - lang: Language in which the weather will be d...

(UNLIKELY_OPENING_PUNCTUATION)


[typographical] ~37-~37: Consider using typographic quotation marks here.
Context: ...e weather will be displayed. Default is "en". - units: Units in which the weather ...

(EN_QUOTES)


[uncategorized] ~38-~38: Loose punctuation mark.
Context: ...be displayed. Default is "en". - units: Units in which the weather will be disp...

(UNLIKELY_OPENING_PUNCTUATION)


[typographical] ~38-~38: Consider using typographic quotation marks here.
Context: ...e weather will be displayed. Default is "m". ### Outputs - weather: The fetched ...

(EN_QUOTES)


[uncategorized] ~42-~42: Loose punctuation mark.
Context: ...ther: The fetched weather data. - url: Requested URL. - stage`: Stage of depl...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~43-~43: Loose punctuation mark.
Context: ... data. - url: Requested URL. - stage: Stage of deployment. - location: Loca...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~44-~44: Loose punctuation mark.
Context: ...tage: Stage of deployment. - location: Location of the reported weather. - la...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~45-~45: Loose punctuation mark.
Context: ...cation of the reported weather. - lang: Language used for weather data. - `unit...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~46-~46: Loose punctuation mark.
Context: ...anguage used for weather data. - units: Units of measurement for the weather da...

(UNLIKELY_OPENING_PUNCTUATION)

tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/providers.tf (1)

16-20: Suggestion: Pin Module Version for Reproducibility

For the iam_roles module you’re sourcing, consider specifying a version. Pinning the module version (if supported) can help avoid unexpected changes from upstream modifications. For example:

-module "iam_roles" {
-  source  = "../account-map/modules/iam-roles"
-  context = module.this.context
-}
+module "iam_roles" {
+  source  = "../account-map/modules/iam-roles"
+  version = "x.y.z"  # specify the module version
+  context = module.this.context
+}
tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/outputs.tf (1)

55-63: VPC Info Map with Context

The output "vpc" builds a neat map combining key VPC attributes. One minor note: there’s a commented-out attribute (subnet_type_tag_value_format) in the block. If it’s no longer needed, consider removing it to keep the configuration clean.

tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/variables.tf (1)

148-152: Traffic Type for Flow Logs with Suggestion for Enhanced Validation

The vpc_flow_logs_traffic_type variable is documented with its valid values. For enhanced safety, consider adding a validation block to restrict the value strictly to "ACCEPT", "REJECT", or "ALL". For example:

 variable "vpc_flow_logs_traffic_type" {
   type        = string
   description = "The type of traffic to capture. Valid values: `ACCEPT`, `REJECT`, `ALL`"
   default     = "ALL"
+  validation {
+    condition     = contains(["ACCEPT", "REJECT", "ALL"], var.vpc_flow_logs_traffic_type)
+    error_message = "vpc_flow_logs_traffic_type must be 'ACCEPT', 'REJECT', or 'ALL'."
+  }
 }
tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/main.tf (3)

10-14: Conditional Calculation for max_subnet_count:
The nested ternary expressions correctly compute the maximum subnet count based on provided input values. For readability, consider adding an inline comment explaining the fallback logic.


36-39: Public Subnets Additional Tags:
The tag map for public subnets is defined clearly. One minor point: the value 1 is used for the ELB role tag; since tag values are typically strings in AWS, consider converting the value to a string for consistency (e.g., "1").


41-44: Private Subnets Additional Tags:
Similarly, the tag map for private subnets is concise. Again, if consistency is a goal, consider representing numeric tag values as strings.

tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/README.md (1)

55-172: Terraform Documentation Auto-Generated Section:
The detailed documentation covering Requirements, Providers, Modules, Resources, Inputs, and Outputs is comprehensive. It enhances the usability of the component.

A couple of minor typographical suggestions from static analysis:

  • Consider using typographic (curly) quotes in the generated documentation for improved readability.
  • For the image at line 171, adding alt text would improve accessibility.
🧰 Tools
🪛 LanguageTool

[typographical] ~60-~60: Consider using a typographic close quote here.
Context: ...| Name | Version | |------|---------| | [terraform](#requirement_terrafor...

(EN_QUOTES)


[typographical] ~61-~61: Consider using a typographic close quote here.
Context: ...#requirement_terraform) | >= 1.0.0 | | aws | >= 4.9....

(EN_QUOTES)


[typographical] ~67-~67: Consider using a typographic close quote here.
Context: ...| Name | Version | |------|---------| | aws | >= 4.9.0 |...

(EN_QUOTES)


[typographical] ~73-~73: Consider using a typographic close quote here.
Context: ...Version | |------|--------|---------| | [endpoint_security_groups](#modu...

(EN_QUOTES)


[typographical] ~74-~74: Consider using a typographic close quote here.
Context: ...oudposse/security-group/aws | 2.2.0 | | iam_roles ...

(EN_QUOTES)


[typographical] ~75-~75: Consider using a typographic close quote here.
Context: ...account-map/modules/iam-roles | n/a | | subnets | clou...

(EN_QUOTES)


[typographical] ~76-~76: Consider using a typographic close quote here.
Context: ...udposse/dynamic-subnets/aws | 2.3.0 | | this | cloudposse...

(EN_QUOTES)


[typographical] ~77-~77: Consider using a typographic close quote here.
Context: ...s) | cloudposse/label/null | 0.25.0 | | utils | cloudpos...

(EN_QUOTES)


[typographical] ~78-~78: Consider using a typographic close quote here.
Context: ...ils) | cloudposse/utils/aws | 1.3.0 | | vpc | cloudposse/v...

(EN_QUOTES)


[typographical] ~79-~79: Consider using a typographic close quote here.
Context: ..._vpc) | cloudposse/vpc/aws | 2.1.0 | | [vpc_endpoints](#module_vpc_end...

(EN_QUOTES)


[typographical] ~80-~80: Consider using a typographic close quote here.
Context: .../aws//modules/vpc-endpoints | 2.1.0 | | [vpc_flow_logs_bucket](#module...

(EN_QUOTES)


[typographical] ~95-~95: Consider using a typographic close quote here.
Context: ...--------|------|---------|:--------:| | [additional_tag_map](#input_add...

(EN_QUOTES)


[typographical] ~96-~96: Consider using a typographic close quote here.
Context: ...ration. | map(string) | {} | no | | [assign_generated_ipv6_cidr_bl...

(EN_QUOTES)


[typographical] ~97-~97: Consider using a typographic close quote here.
Context: ...m_pool_id. | bool|false` | no | | attributes |...

(EN_QUOTES)


[style] ~97-~97: A comma is missing here.
Context: ...s) | ID element. Additional attributes (e.g. workers or cluster) to add to id,...

(EG_NO_COMMA)


[typographical] ~98-~98: Consider using a typographic close quote here.
Context: ...ement. | list(string) | [] | no | | [availability_zone_ids](#input_...

(EN_QUOTES)


[style] ~98-~98: A comma is missing here.
Context: ...bility_zones.<br>Can be the full name, e.g. use1-az1`, or just the part after the ...

(EG_NO_COMMA)


[style] ~98-~98: A comma is missing here.
Context: ...t the part after the AZ ID region code, e.g. -az1,
to allow reusable values acr...

(EG_NO_COMMA)


[typographical] ~99-~99: Consider using a typographic close quote here.
Context: ...ounts. | list(string) | [] | no | | [availability_zones](#input_avai...

(EN_QUOTES)


[style] ~99-~99: A comma is missing here.
Context: ...e_idsis set.<br>Can be the full name, e.g.us-east-1a`, or just the part after th...

(EG_NO_COMMA)


[style] ~99-~99: A comma is missing here.
Context: ...1a, or just the part after the region, e.g. a` to allow reusable values across reg...

(EG_NO_COMMA)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ...ility. | list(string) | [] | no | | context | Singl...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ... any |

{
"additional_tag_map": {},
"attributes": [],
"delim...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ...dditional_tag_map": {},
"attributes": [],
"delimiter": null,
"desc...

(EN_QUOTES)


[typographical] ~100-~100: Consider using typographic quotation marks here.
Context: ...g_map": {},
"attributes": [],
"delimiter": null,
"descriptor_formats": {},<b...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ... "descriptor_formats": {},
"enabled": true,
"environment": null,
"...

(EN_QUOTES)


[typographical] ~100-~100: Consider using typographic quotation marks here.
Context: ...ormats": {},
"enabled": true,
"environment": null,
"id_length_limit": null,<br...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic opening quote here.
Context: ...": true,
"environment": null,
"id_length_limit": null,
"label_key_...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ...nvironment": null,
"id_length_limit": null,
"label_key_case": null,
...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic opening quote here.
Context: ...ull,
"id_length_limit": null,
"label_key_case": null,
"label_order...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ...ength_limit": null,
"label_key_case": null,
"label_order": [],
"la...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic opening quote here.
Context: ...se": null,
"label_order": [],
"label_value_case": null,
"labels_as...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ...label_order": [],
"label_value_case": null,
"labels_as_tags": [
...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic opening quote here.
Context: ...[],
"label_value_case": null,
"labels_as_tags": [
"unset"
]...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ..._value_case": null,
"labels_as_tags": [
"unset"
],
"name": ...

(EN_QUOTES)


[typographical] ~100-~100: Consider using typographic quotation marks here.
Context: ...: null,
"labels_as_tags": [
"unset"
],
"name": null,
"namesp...

(EN_QUOTES)


[typographical] ~100-~100: Consider using typographic quotation marks here.
Context: ...as_tags": [
"unset"
],
"name": null,
"namespace": null,
"re...

(EN_QUOTES)


[typographical] ~100-~100: Consider using typographic quotation marks here.
Context: ..."unset"
],
"name": null,
"namespace": null,
"regex_replace_chars": null...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic opening quote here.
Context: ...me": null,
"namespace": null,
"regex_replace_chars": null,
"stage"...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ...espace": null,
"regex_replace_chars": null,
"stage": null,
"tags":...

(EN_QUOTES)


[typographical] ~100-~100: Consider using typographic quotation marks here.
Context: ...
"regex_replace_chars": null,
"stage": null,
"tags": {},
"tenant": ...

(EN_QUOTES)


[typographical] ~100-~100: Consider using typographic quotation marks here.
Context: ..._chars": null,
"stage": null,
"tags": {},
"tenant": null
}

| n...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ...ge": null,
"tags": {},
"tenant": null
} | no | | <a name="inpu...

(EN_QUOTES)


[typographical] ~101-~101: Consider using a typographic close quote here.
Context: ...br> "tenant": null
} | no | | delimiter | D...

(EN_QUOTES)


[typographical] ~101-~101: Consider using a typographic close quote here.
Context: ...ts.
Defaults to - (hyphen). Set to "" to use no delimiter at all. | `string...

(EN_QUOTES)


[typographical] ~102-~102: Consider using a typographic close quote here.
Context: ...er at all. | string | null | no | | [descriptor_formats](#input_desc...

(EN_QUOTES)


[style] ~102-~102: This sentence is over 40 words long. Consider splitting it up, as shorter sentences make the text easier to read.
Context: ...of maps. Keys are names of descriptors. Values are maps of the form
{<br> format = string<br> labels = list(string)<br>}
(Type is any so the map values can later be enhanced to provide additional options.)
format is a Terraform format string to be passed to the format() function.
labels is a list of labels, in order, to pass to format() function.
Label values will be normalized before being passed to format() so they will be
identical to how they appear in id.
Default is {} (descriptors output will be empty). | any | {} | no | | <a name="inpu...

(TOO_LONG_SENTENCE)


[typographical] ~103-~103: Consider using a typographic close quote here.
Context: ...will be empty). | any | {} | no | | enabled | Set t...

(EN_QUOTES)


[grammar] ~103-~103: Did you mean “too false to”?
Context: ..."> enabled | Set to false to prevent the module from creating any re...

(TOO_ADJECTIVE_TO)


[typographical] ~104-~104: Consider using a typographic close quote here.
Context: ...ny resources | bool | null | no | | environment...

(EN_QUOTES)


[style] ~104-~104: A comma is missing here.
Context: ...) | ID element. Usually used for region e.g. 'uw2', 'us-west-2', OR role 'prod', 'st...

(EG_NO_COMMA)


[typographical] ~105-~105: Consider using a typographic close quote here.
Context: ...ev', 'UAT' | string | null | no | | [gateway_vpc_endpoints](#input_...

(EN_QUOTES)


[typographical] ~105-~105: Consider using a typographic opening quote here.
Context: ...ion into the VPC. Only valid values are "dynamodb" and "s3". | set(string) | `[...

(EN_QUOTES)


[typographical] ~105-~105: Consider using a typographic close quote here.
Context: ...the VPC. Only valid values are "dynamodb" and "s3". | set(string) | [] | no |...

(EN_QUOTES)


[typographical] ~105-~105: Consider using a typographic opening quote here.
Context: ...C. Only valid values are "dynamodb" and "s3". | set(string) | [] | no | | <a ...

(EN_QUOTES)


[typographical] ~105-~105: Consider using a typographic close quote here.
Context: ...Only valid values are "dynamodb" and "s3". | set(string) | [] | no | | <a nam...

(EN_QUOTES)


[typographical] ~106-~106: Consider using a typographic close quote here.
Context: ...d "s3". | set(string) | [] | no | | [id_length_limit](#input_id_le...

(EN_QUOTES)


[grammar] ~106-~106: The verb ‘keep’ seems to be in the wrong form here.
Context: ... for unlimited length.
Set to null for keep the existing setting, which defaults to...

(FOR_VB)


[typographical] ~107-~107: Consider using a typographic close quote here.
Context: ...id_full. | number | null | no | | [interface_vpc_endpoints](#input...

(EN_QUOTES)


[typographical] ~108-~108: Consider using a typographic close quote here.
Context: ...he VPC. | set(string) | [] | no | | [ipv4_additional_cidr_block_as...

(EN_QUOTES)


[typographical] ~109-~109: Consider using a typographic close quote here.
Context: ...= number
})) | {} | no | | [ipv4_cidr_block_association_t...

(EN_QUOTES)


[typographical] ~110-~110: Consider using a typographic close quote here.
Context: ... string
}) | null | no | | ipv4_cidrs...

(EN_QUOTES)


[typographical] ~111-~111: Consider using a typographic close quote here.
Context: ...(string)
})) | [] | no | | [ipv4_primary_cidr_block](#inpu...

(EN_QUOTES)


[typographical] ~112-~112: Consider using a typographic close quote here.
Context: ... not both. | string | null | no | | [ipv4_primary_cidr_block_assoc...

(EN_QUOTES)


[typographical] ~113-~113: Consider using a typographic close quote here.
Context: ... number
}) | null | no | | [label_key_case](#input_label_...

(EN_QUOTES)


[typographical] ~114-~114: Consider using a typographic close quote here.
Context: ...: title. | string | null | no | | [label_order](#input_label_orde...

(EN_QUOTES)


[typographical] ~114-~114: Consider using typographic quotation marks here.
Context: ...ts) appear in the id.
Defaults to ["namespace", "environment", "stage", "name", "attri...

(EN_QUOTES)


[typographical] ~114-~114: Consider using typographic quotation marks here.
Context: ... the id.
Defaults to ["namespace", "environment", "stage", "name", "attributes"].
You...

(EN_QUOTES)


[typographical] ~114-~114: Consider using typographic quotation marks here.
Context: ...efaults to ["namespace", "environment", "stage", "name", "attributes"].
You can omit...

(EN_QUOTES)


[typographical] ~114-~114: Consider using typographic quotation marks here.
Context: ...o ["namespace", "environment", "stage", "name", "attributes"].
You can omit any of ...

(EN_QUOTES)


[typographical] ~114-~114: Consider using typographic quotation marks here.
Context: ...space", "environment", "stage", "name", "attributes"].
You can omit any of the 6 labels (...

(EN_QUOTES)


[typographical] ~114-~114: Consider using typographic quotation marks here.
Context: ...].
You can omit any of the 6 labels ("tenant" is the 6th), but at least one must be p...

(EN_QUOTES)


[typographical] ~115-~115: Consider using a typographic close quote here.
Context: ...ent. | list(string) | null | no | | [label_value_case](#input_label...

(EN_QUOTES)


[typographical] ~115-~115: Consider using a typographic close quote here.
Context: ... this to title and set delimiter to "" to yield Pascal Case IDs.
Default ...

(EN_QUOTES)


[typographical] ~116-~116: Consider using a typographic close quote here.
Context: ...: lower. | string | null | no | | [labels_as_tags](#input_labels...

(EN_QUOTES)


[typographical] ~116-~116: Consider using typographic quotation marks here.
Context: ... ignored. | set(string) |

[
"default"
]
| no | | <a name="input_map_...

(EN_QUOTES)


[typographical] ~117-~117: Consider using a typographic close quote here.
Context: ...re>[
"default"
] | no | | [map_public_ip_on_launch](#inp...

(EN_QUOTES)


[typographical] ~118-~118: Consider using a typographic close quote here.
Context: ...c IP address | bool | true | no | | [max_subnet_count](#input_max_...

(EN_QUOTES)


[uncategorized] ~118-~118: ‘Amount of’ should usually only be used with uncountable or mass nouns. Consider using “number” if this is not the case.
Context: ..._max_subnet_count) | Sets the maximum amount of subnets to deploy. 0 will deploy a s...

(AMOUNTOF_TO_NUMBEROF)


[typographical] ~119-~119: Consider using a typographic close quote here.
Context: ...in the region | number | 0 | no | | name | ID element....

(EN_QUOTES)


[typographical] ~119-~119: Consider adding a comma after ‘Usually’ for more clarity.
Context: ... name | ID element. Usually the component or solution name, e.g. 'a...

(RB_LY_COMMA)


[style] ~119-~119: A comma is missing here.
Context: ...Usually the component or solution name, e.g. 'app' or 'jenkins'.
This is the only...

(EG_NO_COMMA)


[typographical] ~119-~119: Consider using typographic quotation marks here.
Context: ...nt not also included as a tag.
The "name" tag is set to the full id string. The...

(EN_QUOTES)


[typographical] ~120-~120: Consider using a typographic close quote here.
Context: ...meinput. |string|null` | no | | namespace | I...

(EN_QUOTES)


[typographical] ~120-~120: Consider adding a comma after ‘Usually’ for more clarity.
Context: ...space](#input_namespace) | ID element. Usually an abbreviation of your organization na...

(RB_LY_COMMA)


[style] ~120-~120: A comma is missing here.
Context: ...abbreviation of your organization name, e.g. 'eg' or 'cp', to help ensure generated ...

(EG_NO_COMMA)


[style] ~120-~120: A comma and a dot are missing here.
Context: ...iation of your organization name, e.g. 'eg' or 'cp', to help ensure generated IDs ...

(EG_NO_COMMA)


[typographical] ~121-~121: Consider using a typographic close quote here.
Context: ...lly unique | string | null | no | | [nat_eip_aws_shield_protection...

(EN_QUOTES)


[typographical] ~122-~122: Consider using a typographic close quote here.
Context: ...is account. | bool | false | no | | [nat_gateway_enabled](#input_na...

(EN_QUOTES)


[typographical] ~123-~123: Consider using a typographic close quote here.
Context: ...NAT gateways | bool | true | no | | [nat_instance_enabled](#input_n...

(EN_QUOTES)


[typographical] ~124-~124: Consider using a typographic close quote here.
Context: ...T instances | bool | false | no | | [nat_instance_type](#input_nat...

(EN_QUOTES)


[typographical] ~124-~124: Consider using a typographic close quote here.
Context: ..._type) | NAT Instance type | string | "t3.micro" | no | | <a name="input_publi...

(EN_QUOTES)


[typographical] ~125-~125: Consider using a typographic close quote here.
Context: ...type | string | "t3.micro" | no | | [public_subnets_enabled](#input...

(EN_QUOTES)


[typographical] ~126-~126: Consider using a typographic close quote here.
Context: ...hen false. | bool | true | no | | [regex_replace_chars](#input_re...

(EN_QUOTES)


[typographical] ~126-~126: Consider using a typographic close quote here.
Context: ...ed from the ID elements.
If not set, "/[^a-zA-Z0-9-]/" is used to remove all ...

(EN_QUOTES)


[style] ~126-~126: Consider using a more formal/concise alternative here.
Context: ...9-]/"is used to remove all characters other than hyphens, letters and digits. |string`...

(OTHER_THAN)


[style] ~126-~126: The serial comma (Oxford comma, Harvard comma) is missing.
Context: ...move all characters other than hyphens, letters and digits. | string | null | no | | <a...

(SERIAL_COMMA_ON)


[typographical] ~127-~127: Consider using a typographic close quote here.
Context: ...nd digits. | string | null | no | | region | AWS Reg...

(EN_QUOTES)


[typographical] ~128-~128: Consider using a typographic close quote here.
Context: ...| AWS Region | string | n/a | yes | | stage | ID elemen...

(EN_QUOTES)


[style] ~128-~128: A comma is missing here.
Context: ...element. Usually used to indicate role, e.g. 'prod', 'staging', 'source', 'build', '...

(EG_NO_COMMA)


[typographical] ~129-~129: Consider using a typographic close quote here.
Context: ... 'release' | string | null | no | | [subnet_type_tag_key](#input_s...

(EN_QUOTES)


[grammar] ~129-~129: In this context, ‘type’ should agree in number with the noun after ‘of’.
Context: ...pe tag to provide information about the type of subnets, e.g. cpco/subnet/type=private or `cp...

(TYPE_OF_PLURAL)


[style] ~129-~129: A comma is missing here.
Context: ... information about the type of subnets, e.g. cpco/subnet/type=private or `cpcp/sub...

(EG_NO_COMMA)


[typographical] ~130-~130: Consider using a typographic close quote here.
Context: ...type=public|string` | n/a | yes | | tags | Additional ...

(EN_QUOTES)


[style] ~130-~130: A comma is missing here.
Context: ...tags | Additional tags (e.g. {'BusinessUnit': 'XYZ'}).
Neither ...

(EG_NO_COMMA)


[typographical] ~131-~131: Consider using a typographic close quote here.
Context: ...module. | map(string) | {} | no | | tenant | ID elem...

(EN_QUOTES)


[typographical] ~132-~132: Consider using a typographic close quote here.
Context: ...rce is for | string | null | no | | [vpc_flow_logs_bucket_environm...

(EN_QUOTES)


[typographical] ~132-~132: Consider using a typographic close quote here.
Context: ...Logs bucket is provisioned | string | "" | no | | <a name="input_vpc_flow_logs...

(EN_QUOTES)


[typographical] ~133-~133: Consider using a typographic close quote here.
Context: ... provisioned | string | "" | no | | [vpc_flow_logs_bucket_stage_n...

(EN_QUOTES)


[typographical] ~133-~133: Consider using a typographic close quote here.
Context: ...Logs bucket is provisioned | string | "" | no | | <a name="input_vpc_flow_logs...

(EN_QUOTES)


[typographical] ~134-~134: Consider using a typographic close quote here.
Context: ... provisioned | string | "" | no | | [vpc_flow_logs_bucket_tenant_...

(EN_QUOTES)


[typographical] ~135-~135: Consider using a typographic close quote here.
Context: ...as null. | string | null | no | | [vpc_flow_logs_enabled](#input...

(EN_QUOTES)


[typographical] ~136-~136: Consider using a typographic close quote here.
Context: ...PC Flow Logs | bool | true | no | | [vpc_flow_logs_log_destination...

(EN_QUOTES)


[typographical] ~136-~136: Consider using a typographic close quote here.
Context: ...: cloud-watch-logs, s3 | string | "s3" | no | | <a name="input_vpc_flow_lo...

(EN_QUOTES)


[typographical] ~137-~137: Consider using a typographic close quote here.
Context: ...ogs, s3|string|"s3"` | no | | [vpc_flow_logs_traffic_type](#...

(EN_QUOTES)


[typographical] ~137-~137: Consider using a typographic close quote here.
Context: ... ACCEPT, REJECT, ALL | string | "ALL" | no | ## Outputs | Name | Descr...

(EN_QUOTES)


[typographical] ~143-~143: Consider using a typographic close quote here.
Context: ... Description | |------|-------------| | [availability_zones](#output_ava...

(EN_QUOTES)


[typographical] ~144-~144: Consider using a typographic close quote here.
Context: ...ty Zones where subnets were created | | [az_private_subnets_map](#outpu...

(EN_QUOTES)


[typographical] ~145-~145: Consider using a typographic close quote here.
Context: ...st of private subnet IDs in the AZs | | [az_public_subnets_map](#output...

(EN_QUOTES)


[typographical] ~146-~146: Consider using a typographic close quote here.
Context: ...ist of public subnet IDs in the AZs | | [interface_vpc_endpoints](#outpu...

(EN_QUOTES)


[typographical] ~147-~147: Consider using a typographic close quote here.
Context: ...nterface VPC Endpoints in this VPC. | | [max_subnet_count](#output_max...

(EN_QUOTES)


[typographical] ~148-~148: Consider using a typographic close quote here.
Context: ... subnet CIDRs need to be recomputed | | [nat_eip_protections](#output_n...

(EN_QUOTES)


[typographical] ~149-~149: Consider using a typographic close quote here.
Context: ...ed Protections for NAT Elastic IPs. | | [nat_gateway_ids](#output_nat_...

(EN_QUOTES)


[typographical] ~150-~150: Consider using a typographic close quote here.
Context: ...at_gateway_ids) | NAT Gateway IDs | | [nat_gateway_public_ips](#outpu...

(EN_QUOTES)


[typographical] ~151-~151: Consider using a typographic close quote here.
Context: ...blic_ips) | NAT Gateway public IPs | | [nat_instance_ids](#output_nat...

(EN_QUOTES)


[typographical] ~152-~152: Consider using a typographic close quote here.
Context: ..._instance_ids) | NAT Instance IDs | | [private_route_table_ids](#outp...

(EN_QUOTES)


[typographical] ~153-~153: Consider using a typographic close quote here.
Context: ...s) | Private subnet route table IDs | | [private_subnet_cidrs](#output_...

(EN_QUOTES)


[typographical] ~154-~154: Consider using a typographic close quote here.
Context: ...bnet_cidrs) | Private subnet CIDRs | | [private_subnet_ids](#output_pr...

(EN_QUOTES)


[typographical] ~155-~155: Consider using a typographic close quote here.
Context: ..._subnet_ids) | Private subnet IDs | | [public_route_table_ids](#outpu...

(EN_QUOTES)


[typographical] ~156-~156: Consider using a typographic close quote here.
Context: ...ds) | Public subnet route table IDs | | [public_subnet_cidrs](#output_p...

(EN_QUOTES)


[typographical] ~157-~157: Consider using a typographic close quote here.
Context: ...ubnet_cidrs) | Public subnet CIDRs | | [public_subnet_ids](#output_pub...

(EN_QUOTES)


[typographical] ~158-~158: Consider using a typographic close quote here.
Context: ...c_subnet_ids) | Public subnet IDs | | [route_tables](#output_route_ta...

(EN_QUOTES)


[typographical] ~159-~159: Consider using a typographic close quote here.
Context: ...te_tables) | Route tables info map | | subnets | Subn...

(EN_QUOTES)


[typographical] ~160-~160: Consider using a typographic close quote here.
Context: ...output_subnets) | Subnets info map | | vpc | VPC info map...

(EN_QUOTES)


[typographical] ~161-~161: Consider using a typographic close quote here.
Context: ... vpc | VPC info map | | vpc_cidr | ...

(EN_QUOTES)


[typographical] ~162-~162: Consider using a typographic close quote here.
Context: ...idr](#output_vpc_cidr) | VPC CIDR | | [vpc_default_network_acl_id](#...

(EN_QUOTES)


[typographical] ~163-~163: Consider using a typographic close quote here.
Context: ... created by default on VPC creation | | [vpc_default_security_group_id...

(EN_QUOTES)


[typographical] ~164-~164: Consider using a typographic close quote here.
Context: ... created by default on VPC creation | | vpc_id | VPC ...

(EN_QUOTES)


[typographical] ~169-~169: To join two clauses or introduce examples, consider using an em dash.
Context: ...-aws-components/tree/master/modules/vpc) - Cloud Posse's upstream component [<img ...

(DASH_RULE)

🪛 markdownlint-cli2 (0.17.2)

171-171: Images should have alternate text (alt text)
null

(MD045, no-alt-text)

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3be97fe and 1df19ab.

⛔ Files ignored due to path filters (3)
  • tests/fixtures/components/terraform/mock/.terraform/terraform.tfstate is excluded by !**/*.tfstate
  • tests/fixtures/scenarios/hooks-test/components/terraform/hook-and-store/terraform.tfstate.d/test-component1/terraform.tfstate is excluded by !**/*.tfstate
  • tests/fixtures/scenarios/hooks-test/components/terraform/hook-and-store/terraform.tfstate.d/test-component2/terraform.tfstate is excluded by !**/*.tfstate
📒 Files selected for processing (59)
  • cmd/cmd_utils.go (2 hunks)
  • tests/cli_terraform_test.go (7 hunks)
  • tests/cli_test.go (12 hunks)
  • tests/fixtures/README.md (1 hunks)
  • tests/fixtures/atmos.yaml (1 hunks)
  • tests/fixtures/components/terraform/mock/.terraform.lock.hcl (1 hunks)
  • tests/fixtures/components/terraform/mock/.terraform/providers/registry.terraform.io/hashicorp/local/2.5.2/darwin_arm64/LICENSE.txt (1 hunks)
  • tests/fixtures/components/terraform/mock/nonprod-component-1.terraform.tfvars.json (1 hunks)
  • tests/fixtures/components/terraform/myapp/cache.nonprod.txt (1 hunks)
  • tests/fixtures/components/terraform/myapp/prod-myapp.terraform.tfvars.json (1 hunks)
  • tests/fixtures/scenarios/empty-dir/.atmos/cache.yaml (1 hunks)
  • tests/fixtures/scenarios/hooks-test/components/terraform/hook-and-store/.terraform.lock.hcl (1 hunks)
  • tests/fixtures/scenarios/hooks-test/components/terraform/hook-and-store/.terraform/environment (1 hunks)
  • tests/fixtures/scenarios/hooks-test/components/terraform/hook-and-store/.terraform/providers/registry.terraform.io/hashicorp/null/3.2.3/darwin_arm64/LICENSE.txt (1 hunks)
  • tests/fixtures/scenarios/mock-terraform/atmos.yaml (1 hunks)
  • tests/fixtures/scenarios/mock-terraform/components/terraform/mock/backend.tf (1 hunks)
  • tests/fixtures/scenarios/mock-terraform/components/terraform/mock/main.tf (1 hunks)
  • tests/fixtures/scenarios/mock-terraform/components/terraform/mock/mock.json (1 hunks)
  • tests/fixtures/scenarios/mock-terraform/components/terraform/mock/versions.tf (1 hunks)
  • tests/fixtures/scenarios/mock-terraform/stacks/catalog/terraform/mock.yaml (1 hunks)
  • tests/fixtures/scenarios/mock-terraform/stacks/dev/mock.yaml (1 hunks)
  • tests/fixtures/scenarios/mock-terraform/stacks/prod/mock.yaml (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/github/stargazers/main/README.md (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/github/stargazers/main/main.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/github/stargazers/main/outputs.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/github/stargazers/main/providers.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/github/stargazers/main/variables.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/github/stargazers/main/versions.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/README.md (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/context.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/main.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/outputs.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/providers.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/remote-state.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/variables.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/versions.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/vpc-flow-logs.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/test-components/main/README.md (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/test-components/main/main.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/test-components/main/outputs.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/test-components/main/providers.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/test-components/main/variables.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/test-components/main/versions.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/vpc-src/README.md (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/vpc-src/main.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/vpc-src/outputs.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/vpc-src/variables.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/vpc-src/versions.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/weather/main/README.md (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/weather/main/main.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/weather/main/outputs.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/weather/main/providers.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/weather/main/variables.tf (1 hunks)
  • tests/fixtures/scenarios/vendor/components/terraform/weather/main/versions.tf (1 hunks)
  • tests/snapshots/TestCLICommands_atmos_validate_editorconfig_--help.stdout.golden (1 hunks)
  • tests/snapshots/TestCLICommands_atmos_validate_editorconfig_help.stdout.golden (1 hunks)
  • tests/test-cases/core.yaml (7 hunks)
  • tests/test-cases/demo-stacks.yaml (10 hunks)
  • tests/test-cases/log-level-validation.yaml (5 hunks)
✅ Files skipped from review due to trivial changes (13)
  • tests/fixtures/scenarios/vendor/components/terraform/github/stargazers/main/providers.tf
  • tests/fixtures/scenarios/vendor/components/terraform/github/stargazers/main/versions.tf
  • tests/fixtures/components/terraform/mock/nonprod-component-1.terraform.tfvars.json
  • tests/fixtures/scenarios/hooks-test/components/terraform/hook-and-store/.terraform/environment
  • tests/fixtures/scenarios/vendor/components/terraform/vpc-src/versions.tf
  • tests/fixtures/scenarios/vendor/components/terraform/test-components/main/providers.tf
  • tests/fixtures/scenarios/empty-dir/.atmos/cache.yaml
  • tests/fixtures/scenarios/mock-terraform/components/terraform/mock/mock.json
  • tests/fixtures/components/terraform/myapp/prod-myapp.terraform.tfvars.json
  • tests/fixtures/scenarios/vendor/components/terraform/weather/main/versions.tf
  • tests/fixtures/components/terraform/mock/.terraform.lock.hcl
  • tests/fixtures/scenarios/hooks-test/components/terraform/hook-and-store/.terraform.lock.hcl
  • tests/fixtures/scenarios/vendor/components/terraform/test-components/main/versions.tf
🚧 Files skipped from review as they are similar to previous changes (6)
  • tests/snapshots/TestCLICommands_atmos_validate_editorconfig_help.stdout.golden
  • tests/snapshots/TestCLICommands_atmos_validate_editorconfig_--help.stdout.golden
  • cmd/cmd_utils.go
  • tests/test-cases/core.yaml
  • tests/test-cases/demo-stacks.yaml
  • tests/test-cases/log-level-validation.yaml
🧰 Additional context used
🪛 YAMLlint (1.35.1)
tests/fixtures/scenarios/mock-terraform/stacks/dev/mock.yaml

[error] 18-18: no new line character at the end of file

(new-line-at-end-of-file)


[error] 18-18: trailing spaces

(trailing-spaces)

tests/fixtures/scenarios/mock-terraform/stacks/prod/mock.yaml

[error] 18-18: no new line character at the end of file

(new-line-at-end-of-file)


[error] 18-18: trailing spaces

(trailing-spaces)

tests/fixtures/scenarios/mock-terraform/stacks/catalog/terraform/mock.yaml

[error] 13-13: no new line character at the end of file

(new-line-at-end-of-file)


[error] 13-13: trailing spaces

(trailing-spaces)

tests/fixtures/atmos.yaml

[error] 34-34: no new line character at the end of file

(new-line-at-end-of-file)


[error] 34-34: trailing spaces

(trailing-spaces)

🪛 LanguageTool
tests/fixtures/scenarios/vendor/components/terraform/test-components/main/README.md

[uncategorized] ~13-~13: Loose punctuation mark.
Context: ...empty string. ### Outputs - metadata: The data retrieved from IPinfo for the ...

(UNLIKELY_OPENING_PUNCTUATION)

tests/fixtures/scenarios/vendor/components/terraform/vpc-src/README.md

[typographical] ~3-~3: Consider using typographic quotation marks here.
Context: ...afo 10000 rm Weather Component This Terraform "root" module fetches weather information for ...

(EN_QUOTES)


[uncategorized] ~9-~9: You might be missing the article “an” here.
Context: ...ch weather updates for a location using HTTP request. - Write the obtained weather d...

(AI_EN_LECTOR_MISSING_DETERMINER_AN)


[uncategorized] ~34-~34: Loose punctuation mark.
Context: ... where it will be deployed. - location: Location for which the weather is repor...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~34-~34: A determiner appears to be missing. Consider inserting it.
Context: ...tion for which the weather is reported. Default is "Los Angeles". - options: Options ...

(AI_EN_LECTOR_MISSING_DETERMINER)


[typographical] ~34-~34: Consider using typographic quotation marks here.
Context: ...ich the weather is reported. Default is "Los Angeles". - options: Options to customize the ...

(EN_QUOTES)


[uncategorized] ~35-~35: Loose punctuation mark.
Context: ...d. Default is "Los Angeles". - options: Options to customize the output. Defaul...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~35-~35: A determiner appears to be missing. Consider inserting it.
Context: ...ions: Options to customize the output. Default is "0T". - format`: Specifies the outp...

(AI_EN_LECTOR_MISSING_DETERMINER)


[typographical] ~35-~35: Consider using a typographic opening quote here.
Context: ...ons to customize the output. Default is "0T". - format: Specifies the output fo...

(EN_QUOTES)


[typographical] ~35-~35: Consider using a typographic close quote here.
Context: ... to customize the output. Default is "0T". - format: Specifies the output forma...

(EN_QUOTES)


[uncategorized] ~36-~36: Loose punctuation mark.
Context: ... the output. Default is "0T". - format: Specifies the output format. Default is...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~36-~36: A determiner appears to be missing. Consider inserting it.
Context: ... format: Specifies the output format. Default is "v2". - lang: Language in which th...

(AI_EN_LECTOR_MISSING_DETERMINER)


[typographical] ~36-~36: Consider using a typographic opening quote here.
Context: ...Specifies the output format. Default is "v2". - lang: Language in which the wea...

(EN_QUOTES)


[typographical] ~36-~36: Consider using a typographic close quote here.
Context: ...cifies the output format. Default is "v2". - lang: Language in which the weathe...

(EN_QUOTES)


[uncategorized] ~37-~37: Loose punctuation mark.
Context: ...output format. Default is "v2". - lang: Language in which the weather will be d...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~37-~37: A determiner appears to be missing. Consider inserting it.
Context: ...in which the weather will be displayed. Default is "en". - units: Units in which the ...

(AI_EN_LECTOR_MISSING_DETERMINER)


[typographical] ~37-~37: Consider using typographic quotation marks here.
Context: ...e weather will be displayed. Default is "en". - units: Units in which the weather ...

(EN_QUOTES)


[uncategorized] ~38-~38: Loose punctuation mark.
Context: ...be displayed. Default is "en". - units: Units in which the weather will be disp...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~38-~38: A determiner appears to be missing. Consider inserting it.
Context: ...in which the weather will be displayed. Default is "m". ### Outputs - weather: The f...

(AI_EN_LECTOR_MISSING_DETERMINER)


[typographical] ~38-~38: Consider using typographic quotation marks here.
Context: ...e weather will be displayed. Default is "m". ### Outputs - weather: The fetched ...

(EN_QUOTES)


[uncategorized] ~42-~42: Loose punctuation mark.
Context: ...ther: The fetched weather data. - url: Requested URL. - stage`: Stage of depl...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~43-~43: Loose punctuation mark.
Context: ... data. - url: Requested URL. - stage: Stage of deployment. - location: Loca...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~44-~44: Loose punctuation mark.
Context: ...tage: Stage of deployment. - location: Location of the reported weather. - la...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~45-~45: Loose punctuation mark.
Context: ...cation of the reported weather. - lang: Language used for weather data. - `unit...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~46-~46: Loose punctuation mark.
Context: ...anguage used for weather data. - units: Units of measurement for the weather da...

(UNLIKELY_OPENING_PUNCTUATION)

tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/README.md

[typographical] ~60-~60: Consider using a typographic close quote here.
Context: ...| Name | Version | |------|---------| | [terraform](#requirement_terrafor...

(EN_QUOTES)


[typographical] ~61-~61: Consider using a typographic close quote here.
Context: ...#requirement_terraform) | >= 1.0.0 | | aws | >= 4.9....

(EN_QUOTES)


[typographical] ~67-~67: Consider using a typographic close quote here.
Context: ...| Name | Version | |------|---------| | aws | >= 4.9.0 |...

(EN_QUOTES)


[typographical] ~73-~73: Consider using a typographic close quote here.
Context: ...Version | |------|--------|---------| | [endpoint_security_groups](#modu...

(EN_QUOTES)


[typographical] ~74-~74: Consider using a typographic close quote here.
Context: ...oudposse/security-group/aws | 2.2.0 | | iam_roles ...

(EN_QUOTES)


[typographical] ~75-~75: Consider using a typographic close quote here.
Context: ...account-map/modules/iam-roles | n/a | | subnets | clou...

(EN_QUOTES)


[typographical] ~76-~76: Consider using a typographic close quote here.
Context: ...udposse/dynamic-subnets/aws | 2.3.0 | | this | cloudposse...

(EN_QUOTES)


[typographical] ~77-~77: Consider using a typographic close quote here.
Context: ...s) | cloudposse/label/null | 0.25.0 | | utils | cloudpos...

(EN_QUOTES)


[typographical] ~78-~78: Consider using a typographic close quote here.
Context: ...ils) | cloudposse/utils/aws | 1.3.0 | | vpc | cloudposse/v...

(EN_QUOTES)


[typographical] ~79-~79: Consider using a typographic close quote here.
Context: ..._vpc) | cloudposse/vpc/aws | 2.1.0 | | [vpc_endpoints](#module_vpc_end...

(EN_QUOTES)


[typographical] ~80-~80: Consider using a typographic close quote here.
Context: .../aws//modules/vpc-endpoints | 2.1.0 | | [vpc_flow_logs_bucket](#module...

(EN_QUOTES)


[typographical] ~95-~95: Consider using a typographic close quote here.
Context: ...--------|------|---------|:--------:| | [additional_tag_map](#input_add...

(EN_QUOTES)


[typographical] ~96-~96: Consider using a typographic close quote here.
Context: ...ration. | map(string) | {} | no | | [assign_generated_ipv6_cidr_bl...

(EN_QUOTES)


[typographical] ~97-~97: Consider using a typographic close quote here.
Context: ...m_pool_id. | bool|false` | no | | attributes |...

(EN_QUOTES)


[style] ~97-~97: A comma is missing here.
Context: ...s) | ID element. Additional attributes (e.g. workers or cluster) to add to id,...

(EG_NO_COMMA)


[typographical] ~98-~98: Consider using a typographic close quote here.
Context: ...ement. | list(string) | [] | no | | [availability_zone_ids](#input_...

(EN_QUOTES)


[style] ~98-~98: A comma is missing here.
Context: ...bility_zones.<br>Can be the full name, e.g. use1-az1`, or just the part after the ...

(EG_NO_COMMA)


[style] ~98-~98: A comma is missing here.
Context: ...t the part after the AZ ID region code, e.g. -az1,
to allow reusable values acr...

(EG_NO_COMMA)


[typographical] ~99-~99: Consider using a typographic close quote here.
Context: ...ounts. | list(string) | [] | no | | [availability_zones](#input_avai...

(EN_QUOTES)


[style] ~99-~99: A comma is missing here.
Context: ...e_idsis set.<br>Can be the full name, e.g.us-east-1a`, or just the part after th...

(EG_NO_COMMA)


[style] ~99-~99: A comma is missing here.
Context: ...1a, or just the part after the region, e.g. a` to allow reusable values across reg...

(EG_NO_COMMA)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ...ility. | list(string) | [] | no | | context | Singl...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ... any |

{
"additional_tag_map": {},
"attributes": [],
"delim...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ...dditional_tag_map": {},
"attributes": [],
"delimiter": null,
"desc...

(EN_QUOTES)


[typographical] ~100-~100: Consider using typographic quotation marks here.
Context: ...g_map": {},
"attributes": [],
"delimiter": null,
"descriptor_formats": {},<b...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ... "descriptor_formats": {},
"enabled": true,
"environment": null,
"...

(EN_QUOTES)


[typographical] ~100-~100: Consider using typographic quotation marks here.
Context: ...ormats": {},
"enabled": true,
"environment": null,
"id_length_limit": null,<br...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic opening quote here.
Context: ...": true,
"environment": null,
"id_length_limit": null,
"label_key_...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ...nvironment": null,
"id_length_limit": null,
"label_key_case": null,
...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic opening quote here.
Context: ...ull,
"id_length_limit": null,
"label_key_case": null,
"label_order...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ...ength_limit": null,
"label_key_case": null,
"label_order": [],
"la...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic opening quote here.
Context: ...se": null,
"label_order": [],
"label_value_case": null,
"labels_as...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ...label_order": [],
"label_value_case": null,
"labels_as_tags": [
...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic opening quote here.
Context: ...[],
"label_value_case": null,
"labels_as_tags": [
"unset"
]...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ..._value_case": null,
"labels_as_tags": [
"unset"
],
"name": ...

(EN_QUOTES)


[typographical] ~100-~100: Consider using typographic quotation marks here.
Context: ...: null,
"labels_as_tags": [
"unset"
],
"name": null,
"namesp...

(EN_QUOTES)


[typographical] ~100-~100: Consider using typographic quotation marks here.
Context: ...as_tags": [
"unset"
],
"name": null,
"namespace": null,
"re...

(EN_QUOTES)


[typographical] ~100-~100: Consider using typographic quotation marks here.
Context: ..."unset"
],
"name": null,
"namespace": null,
"regex_replace_chars": null...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic opening quote here.
Context: ...me": null,
"namespace": null,
"regex_replace_chars": null,
"stage"...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ...espace": null,
"regex_replace_chars": null,
"stage": null,
"tags":...

(EN_QUOTES)


[typographical] ~100-~100: Consider using typographic quotation marks here.
Context: ...
"regex_replace_chars": null,
"stage": null,
"tags": {},
"tenant": ...

(EN_QUOTES)


[typographical] ~100-~100: Consider using typographic quotation marks here.
Context: ..._chars": null,
"stage": null,
"tags": {},
"tenant": null
}

| n...

(EN_QUOTES)


[typographical] ~100-~100: Consider using a typographic close quote here.
Context: ...ge": null,
"tags": {},
"tenant": null
} | no | | <a name="inpu...

(EN_QUOTES)


[typographical] ~101-~101: Consider using a typographic close quote here.
Context: ...br> "tenant": null
} | no | | delimiter | D...

(EN_QUOTES)


[typographical] ~101-~101: Consider using a typographic close quote here.
Context: ...ts.
Defaults to - (hyphen). Set to "" to use no delimiter at all. | `string...

(EN_QUOTES)


[typographical] ~102-~102: Consider using a typographic close quote here.
Context: ...er at all. | string | null | no | | [descriptor_formats](#input_desc...

(EN_QUOTES)


[style] ~102-~102: This sentence is over 40 words long. Consider splitting it up, as shorter sentences make the text easier to read.
Context: ...of maps. Keys are names of descriptors. Values are maps of the form
{<br> format = string<br> labels = list(string)<br>}
(Type is any so the map values can later be enhanced to provide additional options.)
format is a Terraform format string to be passed to the format() function.
labels is a list of labels, in order, to pass to format() function.
Label values will be normalized before being passed to format() so they will be
identical to how they appear in id.
Default is {} (descriptors output will be empty). | any | {} | no | | <a name="inpu...

(TOO_LONG_SENTENCE)


[typographical] ~103-~103: Consider using a typographic close quote here.
Context: ...will be empty). | any | {} | no | | enabled | Set t...

(EN_QUOTES)


[grammar] ~103-~103: Did you mean “too false to”?
Context: ..."> enabled | Set to false to prevent the module from creating any re...

(TOO_ADJECTIVE_TO)


[typographical] ~104-~104: Consider using a typographic close quote here.
Context: ...ny resources | bool | null | no | | environment...

(EN_QUOTES)


[style] ~104-~104: A comma is missing here.
Context: ...) | ID element. Usually used for region e.g. 'uw2', 'us-west-2', OR role 'prod', 'st...

(EG_NO_COMMA)


[typographical] ~105-~105: Consider using a typographic close quote here.
Context: ...ev', 'UAT' | string | null | no | | [gateway_vpc_endpoints](#input_...

(EN_QUOTES)


[typographical] ~105-~105: Consider using a typographic opening quote here.
Context: ...ion into the VPC. Only valid values are "dynamodb" and "s3". | set(string) | `[...

(EN_QUOTES)


[typographical] ~105-~105: Consider using a typographic close quote here.
Context: ...the VPC. Only valid values are "dynamodb" and "s3". | set(string) | [] | no |...

(EN_QUOTES)


[typographical] ~105-~105: Consider using a typographic opening quote here.
Context: ...C. Only valid values are "dynamodb" and "s3". | set(string) | [] | no | | <a ...

(EN_QUOTES)


[typographical] ~105-~105: Consider using a typographic close quote here.
Context: ...Only valid values are "dynamodb" and "s3". | set(string) | [] | no | | <a nam...

(EN_QUOTES)


[typographical] ~106-~106: Consider using a typographic close quote here.
Context: ...d "s3". | set(string) | [] | no | | [id_length_limit](#input_id_le...

(EN_QUOTES)


[grammar] ~106-~106: The verb ‘keep’ seems to be in the wrong form here.
Context: ... for unlimited length.
Set to null for keep the existing setting, which defaults to...

(FOR_VB)


[typographical] ~107-~107: Consider using a typographic close quote here.
Context: ...id_full. | number | null | no | | [interface_vpc_endpoints](#input...

(EN_QUOTES)


[typographical] ~108-~108: Consider using a typographic close quote here.
Context: ...he VPC. | set(string) | [] | no | | [ipv4_additional_cidr_block_as...

(EN_QUOTES)


[typographical] ~109-~109: Consider using a typographic close quote here.
Context: ...= number
})) | {} | no | | [ipv4_cidr_block_association_t...

(EN_QUOTES)


[typographical] ~110-~110: Consider using a typographic close quote here.
Context: ... string
}) | null | no | | ipv4_cidrs...

(EN_QUOTES)


[typographical] ~111-~111: Consider using a typographic close quote here.
Context: ...(string)
})) | [] | no | | [ipv4_primary_cidr_block](#inpu...

(EN_QUOTES)


[typographical] ~112-~112: Consider using a typographic close quote here.
Context: ... not both. | string | null | no | | [ipv4_primary_cidr_block_assoc...

(EN_QUOTES)


[typographical] ~113-~113: Consider using a typographic close quote here.
Context: ... number
}) | null | no | | [label_key_case](#input_label_...

(EN_QUOTES)


[typographical] ~114-~114: Consider using a typographic close quote here.
Context: ...: title. | string | null | no | | [label_order](#input_label_orde...

(EN_QUOTES)


[typographical] ~114-~114: Consider using typographic quotation marks here.
Context: ...ts) appear in the id.
Defaults to ["namespace", "environment", "stage", "name", "attri...

(EN_QUOTES)


[typographical] ~114-~114: Consider using typographic quotation marks here.
Context: ... the id.
Defaults to ["namespace", "environment", "stage", "name", "attributes"].
You...

(EN_QUOTES)


[typographical] ~114-~114: Consider using typographic quotation marks here.
Context: ...efaults to ["namespace", "environment", "stage", "name", "attributes"].
You can omit...

(EN_QUOTES)


[typographical] ~114-~114: Consider using typographic quotation marks here.
Context: ...o ["namespace", "environment", "stage", "name", "attributes"].
You can omit any of ...

(EN_QUOTES)


[typographical] ~114-~114: Consider using typographic quotation marks here.
Context: ...space", "environment", "stage", "name", "attributes"].
You can omit any of the 6 labels (...

(EN_QUOTES)


[typographical] ~114-~114: Consider using typographic quotation marks here.
Context: ...].
You can omit any of the 6 labels ("tenant" is the 6th), but at least one must be p...

(EN_QUOTES)


[typographical] ~115-~115: Consider using a typographic close quote here.
Context: ...ent. | list(string) | null | no | | [label_value_case](#input_label...

(EN_QUOTES)


[typographical] ~115-~115: Consider using a typographic close quote here.
Context: ... this to title and set delimiter to "" to yield Pascal Case IDs.
Default ...

(EN_QUOTES)


[typographical] ~116-~116: Consider using a typographic close quote here.
Context: ...: lower. | string | null | no | | [labels_as_tags](#input_labels...

(EN_QUOTES)


[typographical] ~116-~116: Consider using typographic quotation marks here.
Context: ... ignored. | set(string) |

[
"default"
]
| no | | <a name="input_map_...

(EN_QUOTES)


[typographical] ~117-~117: Consider using a typographic close quote here.
Context: ...re>[
"default"
] | no | | [map_public_ip_on_launch](#inp...

(EN_QUOTES)


[typographical] ~118-~118: Consider using a typographic close quote here.
Context: ...c IP address | bool | true | no | | [max_subnet_count](#input_max_...

(EN_QUOTES)


[uncategorized] ~118-~118: ‘Amount of’ should usually only be used with uncountable or mass nouns. Consider using “number” if this is not the case.
Context: ..._max_subnet_count) | Sets the maximum amount of subnets to deploy. 0 will deploy a s...

(AMOUNTOF_TO_NUMBEROF)


[typographical] ~119-~119: Consider using a typographic close quote here.
Context: ...in the region | number | 0 | no | | name | ID element....

(EN_QUOTES)


[typographical] ~119-~119: Consider adding a comma after ‘Usually’ for more clarity.
Context: ... name | ID element. Usually the component or solution name, e.g. 'a...

(RB_LY_COMMA)


[style] ~119-~119: A comma is missing here.
Context: ...Usually the component or solution name, e.g. 'app' or 'jenkins'.
This is the only...

(EG_NO_COMMA)


[typographical] ~119-~119: Consider using typographic quotation marks here.
Context: ...nt not also included as a tag.
The "name" tag is set to the full id string. The...

(EN_QUOTES)


[typographical] ~120-~120: Consider using a typographic close quote here.
Context: ...meinput. |string|null` | no | | namespace | I...

(EN_QUOTES)


[typographical] ~120-~120: Consider adding a comma after ‘Usually’ for more clarity.
Context: ...space](#input_namespace) | ID element. Usually an abbreviation of your organization na...

(RB_LY_COMMA)


[style] ~120-~120: A comma is missing here.
Context: ...abbreviation of your organization name, e.g. 'eg' or 'cp', to help ensure generated ...

(EG_NO_COMMA)


[style] ~120-~120: A comma and a dot are missing here.
Context: ...iation of your organization name, e.g. 'eg' or 'cp', to help ensure generated IDs ...

(EG_NO_COMMA)


[typographical] ~121-~121: Consider using a typographic close quote here.
Context: ...lly unique | string | null | no | | [nat_eip_aws_shield_protection...

(EN_QUOTES)


[typographical] ~122-~122: Consider using a typographic close quote here.
Context: ...is account. | bool | false | no | | [nat_gateway_enabled](#input_na...

(EN_QUOTES)


[typographical] ~123-~123: Consider using a typographic close quote here.
Context: ...NAT gateways | bool | true | no | | [nat_instance_enabled](#input_n...

(EN_QUOTES)


[typographical] ~124-~124: Consider using a typographic close quote here.
Context: ...T instances | bool | false | no | | [nat_instance_type](#input_nat...

(EN_QUOTES)


[typographical] ~124-~124: Consider using a typographic close quote here.
Context: ..._type) | NAT Instance type | string | "t3.micro" | no | | <a name="input_publi...

(EN_QUOTES)


[typographical] ~125-~125: Consider using a typographic close quote here.
Context: ...type | string | "t3.micro" | no | | [public_subnets_enabled](#input...

(EN_QUOTES)


[typographical] ~126-~126: Consider using a typographic close quote here.
Context: ...hen false. | bool | true | no | | [regex_replace_chars](#input_re...

(EN_QUOTES)


[typographical] ~126-~126: Consider using a typographic close quote here.
Context: ...ed from the ID elements.
If not set, "/[^a-zA-Z0-9-]/" is used to remove all ...

(EN_QUOTES)


[style] ~126-~126: Consider using a more formal/concise alternative here.
Context: ...9-]/"is used to remove all characters other than hyphens, letters and digits. |string`...

(OTHER_THAN)


[style] ~126-~126: The serial comma (Oxford comma, Harvard comma) is missing.
Context: ...move all characters other than hyphens, letters and digits. | string | null | no | | <a...

(SERIAL_COMMA_ON)


[typographical] ~127-~127: Consider using a typographic close quote here.
Context: ...nd digits. | string | null | no | | region | AWS Reg...

(EN_QUOTES)


[typographical] ~128-~128: Consider using a typographic close quote here.
Context: ...| AWS Region | string | n/a | yes | | stage | ID elemen...

(EN_QUOTES)


[style] ~128-~128: A comma is missing here.
Context: ...element. Usually used to indicate role, e.g. 'prod', 'staging', 'source', 'build', '...

(EG_NO_COMMA)


[typographical] ~129-~129: Consider using a typographic close quote here.
Context: ... 'release' | string | null | no | | [subnet_type_tag_key](#input_s...

(EN_QUOTES)


[grammar] ~129-~129: In this context, ‘type’ should agree in number with the noun after ‘of’.
Context: ...pe tag to provide information about the type of subnets, e.g. cpco/subnet/type=private or `cp...

(TYPE_OF_PLURAL)


[style] ~129-~129: A comma is missing here.
Context: ... information about the type of subnets, e.g. cpco/subnet/type=private or `cpcp/sub...

(EG_NO_COMMA)


[typographical] ~130-~130: Consider using a typographic close quote here.
Context: ...type=public|string` | n/a | yes | | tags | Additional ...

(EN_QUOTES)


[style] ~130-~130: A comma is missing here.
Context: ...tags | Additional tags (e.g. {'BusinessUnit': 'XYZ'}).
Neither ...

(EG_NO_COMMA)


[typographical] ~131-~131: Consider using a typographic close quote here.
Context: ...module. | map(string) | {} | no | | tenant | ID elem...

(EN_QUOTES)


[typographical] ~132-~132: Consider using a typographic close quote here.
Context: ...rce is for | string | null | no | | [vpc_flow_logs_bucket_environm...

(EN_QUOTES)


[typographical] ~132-~132: Consider using a typographic close quote here.
Context: ...Logs bucket is provisioned | string | "" | no | | <a name="input_vpc_flow_logs...

(EN_QUOTES)


[typographical] ~133-~133: Consider using a typographic close quote here.
Context: ... provisioned | string | "" | no | | [vpc_flow_logs_bucket_stage_n...

(EN_QUOTES)


[typographical] ~133-~133: Consider using a typographic close quote here.
Context: ...Logs bucket is provisioned | string | "" | no | | <a name="input_vpc_flow_logs...

(EN_QUOTES)


[typographical] ~134-~134: Consider using a typographic close quote here.
Context: ... provisioned | string | "" | no | | [vpc_flow_logs_bucket_tenant_...

(EN_QUOTES)


[typographical] ~135-~135: Consider using a typographic close quote here.
Context: ...as null. | string | null | no | | [vpc_flow_logs_enabled](#input...

(EN_QUOTES)


[typographical] ~136-~136: Consider using a typographic close quote here.
Context: ...PC Flow Logs | bool | true | no | | [vpc_flow_logs_log_destination...

(EN_QUOTES)


[typographical] ~136-~136: Consider using a typographic close quote here.
Context: ...: cloud-watch-logs, s3 | string | "s3" | no | | <a name="input_vpc_flow_lo...

(EN_QUOTES)


[typographical] ~137-~137: Consider using a typographic close quote here.
Context: ...ogs, s3|string|"s3"` | no | | [vpc_flow_logs_traffic_type](#...

(EN_QUOTES)


[typographical] ~137-~137: Consider using a typographic close quote here.
Context: ... ACCEPT, REJECT, ALL | string | "ALL" | no | ## Outputs | Name | Descr...

(EN_QUOTES)


[typographical] ~143-~143: Consider using a typographic close quote here.
Context: ... Description | |------|-------------| | [availability_zones](#output_ava...

(EN_QUOTES)


[typographical] ~144-~144: Consider using a typographic close quote here.
Context: ...ty Zones where subnets were created | | [az_private_subnets_map](#outpu...

(EN_QUOTES)


[typographical] ~145-~145: Consider using a typographic close quote here.
Context: ...st of private subnet IDs in the AZs | | [az_public_subnets_map](#output...

(EN_QUOTES)


[typographical] ~146-~146: Consider using a typographic close quote here.
Context: ...ist of public subnet IDs in the AZs | | [interface_vpc_endpoints](#outpu...

(EN_QUOTES)


[typographical] ~147-~147: Consider using a typographic close quote here.
Context: ...nterface VPC Endpoints in this VPC. | | [max_subnet_count](#output_max...

(EN_QUOTES)


[typographical] ~148-~148: Consider using a typographic close quote here.
Context: ... subnet CIDRs need to be recomputed | | [nat_eip_protections](#output_n...

(EN_QUOTES)


[typographical] ~149-~149: Consider using a typographic close quote here.
Context: ...ed Protections for NAT Elastic IPs. | | [nat_gateway_ids](#output_nat_...

(EN_QUOTES)


[typographical] ~150-~150: Consider using a typographic close quote here.
Context: ...at_gateway_ids) | NAT Gateway IDs | | [nat_gateway_public_ips](#outpu...

(EN_QUOTES)


[typographical] ~151-~151: Consider using a typographic close quote here.
Context: ...blic_ips) | NAT Gateway public IPs | | [nat_instance_ids](#output_nat...

(EN_QUOTES)


[typographical] ~152-~152: Consider using a typographic close quote here.
Context: ..._instance_ids) | NAT Instance IDs | | [private_route_table_ids](#outp...

(EN_QUOTES)


[typographical] ~153-~153: Consider using a typographic close quote here.
Context: ...s) | Private subnet route table IDs | | [private_subnet_cidrs](#output_...

(EN_QUOTES)


[typographical] ~154-~154: Consider using a typographic close quote here.
Context: ...bnet_cidrs) | Private subnet CIDRs | | [private_subnet_ids](#output_pr...

(EN_QUOTES)


[typographical] ~155-~155: Consider using a typographic close quote here.
Context: ..._subnet_ids) | Private subnet IDs | | [public_route_table_ids](#outpu...

(EN_QUOTES)


[typographical] ~156-~156: Consider using a typographic close quote here.
Context: ...ds) | Public subnet route table IDs | | [public_subnet_cidrs](#output_p...

(EN_QUOTES)


[typographical] ~157-~157: Consider using a typographic close quote here.
Context: ...ubnet_cidrs) | Public subnet CIDRs | | [public_subnet_ids](#output_pub...

(EN_QUOTES)


[typographical] ~158-~158: Consider using a typographic close quote here.
Context: ...c_subnet_ids) | Public subnet IDs | | [route_tables](#output_route_ta...

(EN_QUOTES)


[typographical] ~159-~159: Consider using a typographic close quote here.
Context: ...te_tables) | Route tables info map | | subnets | Subn...

(EN_QUOTES)


[typographical] ~160-~160: Consider using a typographic close quote here.
Context: ...output_subnets) | Subnets info map | | vpc | VPC info map...

(EN_QUOTES)


[typographical] ~161-~161: Consider using a typographic close quote here.
Context: ... vpc | VPC info map | | vpc_cidr | ...

(EN_QUOTES)


[typographical] ~162-~162: Consider using a typographic close quote here.
Context: ...idr](#output_vpc_cidr) | VPC CIDR | | [vpc_default_network_acl_id](#...

(EN_QUOTES)


[typographical] ~163-~163: Consider using a typographic close quote here.
Context: ... created by default on VPC creation | | [vpc_default_security_group_id...

(EN_QUOTES)


[typographical] ~164-~164: Consider using a typographic close quote here.
Context: ... created by default on VPC creation | | vpc_id | VPC ...

(EN_QUOTES)


[typographical] ~169-~169: To join two clauses or introduce examples, consider using an em dash.
Context: ...-aws-components/tree/master/modules/vpc) - Cloud Posse's upstream component [<img ...

(DASH_RULE)

tests/fixtures/components/terraform/mock/.terraform/providers/registry.terraform.io/hashicorp/local/2.5.2/darwin_arm64/LICENSE.txt

[typographical] ~9-~9: Consider using typographic quotation marks here.
Context: ...== 1. Definitions -------------- 1.1. "Contributor" means each individual or legal enti...

(EN_QUOTES)


[typographical] ~13-~13: Consider using typographic quotation marks here.
Context: ...ion of, or owns Covered Software. 1.2. "Contributor Version" means the combination of the Contri...

(EN_QUOTES)


[typographical] ~17-~17: Consider using typographic quotation marks here.
Context: ...cular Contributor's Contribution. 1.3. "Contribution" means Covered Software of a particu...

(EN_QUOTES)


[typographical] ~20-~20: Consider using typographic quotation marks here.
Context: ...ware of a particular Contributor. 1.4. "Covered Software" means Source Code Form to which the...

(EN_QUOTES)


[typographical] ~26-~26: Consider using a typographic opening quote here.
Context: ...e including portions thereof. 1.5. "Incompatible With Secondary Licenses" ...

(EN_QUOTES)


[typographical] ~26-~26: Consider using a typographic close quote here.
Context: ...5. "Incompatible With Secondary Licenses" means (a) that the initial Con...

(EN_QUOTES)


[typographical] ~36-~36: Consider using typographic quotation marks here.
Context: ... terms of a Secondary License. 1.6. "Executable Form" means any form of the work other th...

(EN_QUOTES)


[style] ~37-~37: Consider using a more formal/concise alternative here.
Context: ...le Form" means any form of the work other than Source Code Form. 1.7. "Larger Work" ...

(OTHER_THAN)


[typographical] ~39-~39: Consider using typographic quotation marks here.
Context: ...work other than Source Code Form. 1.7. "Larger Work" means a work that combines Covered ...

(EN_QUOTES)


[typographical] ~43-~43: Consider using typographic quotation marks here.
Context: ...es, that is not Covered Software. 1.8. "License" means this document. 1.9. "Licensa...

(EN_QUOTES)


[typographical] ~46-~46: Consider using typographic quotation marks here.
Context: ...License" means this document. 1.9. "Licensable" means having the right to grant, to...

(EN_QUOTES)


[style] ~48-~48: ‘any and all’ might be wordy. Consider a shorter alternative.
Context: ...e of the initial grant or subsequently, any and all of the rights conveyed by this License....

(EN_WORDINESS_PREMIUM_ANY_AND_ALL)


[typographical] ~51-~51: Consider using typographic quotation marks here.
Context: ...rights conveyed by this License. 1.10. "Modifications" means any of the following: (a...

(EN_QUOTES)


[typographical] ~61-~61: Consider using typographic quotation marks here.
Context: ...ns any Covered Software. 1.11. "Patent Claims" of a Contributor means any patent c...

(EN_QUOTES)


[typographical] ~69-~69: Consider using typographic quotation marks here.
Context: ... or its Contributor Version. 1.12. "Secondary License" means either the GNU General Public...

(EN_QUOTES)


[typographical] ~75-~75: Consider using a typographic opening quote here.
Context: ... versions of those licenses. 1.13. "Source Code Form" means the form of ...

(EN_QUOTES)


[typographical] ~75-~75: Consider using a typographic close quote here.
Context: ...e licenses. 1.13. "Source Code Form" means the form of the work preferre...

(EN_QUOTES)


[typographical] ~78-~78: Consider using typographic quotation marks here.
Context: ...ferred for making modifications. 1.14. "You" (or "Your") means an individual or ...

(EN_QUOTES)


[typographical] ~78-~78: Consider using typographic quotation marks here.
Context: ... making modifications. 1.14. "You" (or "Your") means an individual or a legal ent...

(EN_QUOTES)


[typographical] ~80-~80: Consider using typographic quotation marks here.
Context: ...r this License. For legal entities, "You" includes any entity that controls, ...

(EN_QUOTES)


[typographical] ~82-~82: Consider using typographic quotation marks here.
Context: ...u. For purposes of this definition, "control" means (a) the power, direct or indi...

(EN_QUOTES)


[style] ~108-~108: ‘with respect to’ might be wordy. Consider a shorter alternative.
Context: ...te The licenses granted in Section 2.1 with respect to any Contribution become effective for e...

(EN_WORDINESS_PREMIUM_WITH_RESPECT_TO)


[grammar] ~109-~109: The usual preposition for “contribution” is “to”. Did you mean “Contribution to”?
Context: ... Contribution become effective for each Contribution on the date the Contributor first distribu...

(ON_THE_NOVEL)


[uncategorized] ~174-~174: Possible missing comma found.
Context: ...stribute Covered Software in Executable Form then: (a) such Covered Software must a...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~210-~210: The serial comma (Oxford comma, Harvard comma) is missing.
Context: ...to charge a fee for, warranty, support, indemnity or liability obligations to one or more re...

(SERIAL_COMMA_ON)


[style] ~212-~212: Only include ‘own’ if you want to emphasize that something belongs to a person or thing or was done by a person or thing.
Context: ...oftware. However, You may do so only on Your own behalf, and not on behalf of any Contri...

(PRP_OWN)


[style] ~213-~213: As an alternative to the over-used intensifier ‘absolutely’, consider replacing this phrase.
Context: ...lf of any Contributor. You must make it absolutely clear that any such warranty, support, indemn...

(EN_WEAK_ADJECTIVE)


[style] ~216-~216: The serial comma (Oxford comma, Harvard comma) is missing.
Context: ...butor as a result of warranty, support, indemnity or liability terms You offer. You may incl...

(SERIAL_COMMA_ON)


[style] ~225-~225: ‘with respect to’ might be wordy. Consider a shorter alternative.
Context: ...y with any of the terms of this License with respect to some or all of the Covered Software due...

(EN_WORDINESS_PREMIUM_WITH_RESPECT_TO)


[typographical] ~227-~227: Conjunctions like ‘and’ should not follow semicolons. Consider using a comma, or removing the conjunction.
Context: ...s License to the maximum extent possible; and (b) describe the limitations and the code...

(CONJUNCTION_AFTER_SEMICOLON)


[style] ~243-~243: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ...non-compliance by some reasonable means prior to 60 days after You have come back into c...

(EN_WORDINESS_PREMIUM_PRIOR_TO)


[style] ~248-~248: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ...h Contributor, and You become compliant prior to 30 days after Your receipt of the notic...

(EN_WORDINESS_PREMIUM_PRIOR_TO)


[style] ~255-~255: ‘any and all’ might be wordy. Consider a shorter alternative.
Context: ...tent, then the rights granted to You by any and all Contributors for the Covered Software u...

(EN_WORDINESS_PREMIUM_ANY_AND_ALL)


[style] ~260-~260: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ...or Your distributors under this License prior to termination shall survive termination. ...

(EN_WORDINESS_PREMIUM_PRIOR_TO)


[typographical] ~268-~268: Consider using typographic quotation marks here.
Context: ...re is provided under this License on an "as is" * * basis, without warranty of a...

(EN_QUOTES)


[uncategorized] ~272-~272: “to the” seems less likely than “to”.
Context: ...e or non-infringing. The entire risk as to the * * quality and performance of the...

(AI_HYDRA_LEO_CP_TO_THE_TO)


[style] ~318-~318: This phrase is redundant. Consider using “subject” to avoid wordiness.
Context: ...s the complete agreement concerning the subject matter hereof. If any provision of this Licens...

(SUBJECT_MATTER)


[style] ~331-~331: Consider using a more formal/concise alternative here.
Context: ...ept as provided in Section 10.3, no one other than the license steward has the right to mo...

(OTHER_THAN)


[style] ~331-~331: To elevate your writing, try using more concise and formal language here.
Context: ..., no one other than the license steward has the right to modify or publish new versions of th...

(RIGHT_TO_ENTITLED)


[uncategorized] ~353-~353: Possible missing preposition found.
Context: ...If You choose to distribute Source Code Form that is Incompatible With Secondary Lic...

(AI_HYDRA_LEO_MISSING_IN)


[typographical] ~357-~357: To join two clauses or introduce examples, consider using an em dash.
Context: ...his License must be attached. Exhibit A - Source Code Form License Notice --------...

(DASH_RULE)


[typographical] ~371-~371: To join two clauses or introduce examples, consider using an em dash.
Context: ...tices of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" N...

(DASH_RULE)


[typographical] ~371-~371: Consider using a typographic opening quote here.
Context: ...es of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" No...

(EN_QUOTES)


[typographical] ~371-~371: Consider using a typographic close quote here.
Context: ... - "Incompatible With Secondary Licenses" Notice --------------------------------...

(EN_QUOTES)


[typographical] ~374-~374: Consider using a typographic opening quote here.
Context: ...----------- This Source Code Form is "Incompatible With Secondary Licenses", a...

(EN_QUOTES)


[typographical] ~374-~374: Consider using a typographic close quote here.
Context: ...is "Incompatible With Secondary Licenses", as defined by the Mozilla Public Lic...

(EN_QUOTES)

tests/fixtures/components/terraform/myapp/cache.nonprod.txt

[uncategorized] ~4-~4: A punctuation mark might be missing here.
Context: ... Overcast �[38;5;240;1m .--. �[0m �[38;5;050m0�[0m(�[38;...

(AI_EN_LECTOR_MISSING_PUNCTUATION)

tests/fixtures/scenarios/hooks-test/components/terraform/hook-and-store/.terraform/providers/registry.terraform.io/hashicorp/null/3.2.3/darwin_arm64/LICENSE.txt

[typographical] ~9-~9: Consider using typographic quotation marks here.
Context: ...== 1. Definitions -------------- 1.1. "Contributor" means each individual or legal enti...

(EN_QUOTES)


[typographical] ~13-~13: Consider using typographic quotation marks here.
Context: ...ion of, or owns Covered Software. 1.2. "Contributor Version" means the combination of the Contri...

(EN_QUOTES)


[typographical] ~17-~17: Consider using typographic quotation marks here.
Context: ...cular Contributor's Contribution. 1.3. "Contribution" means Covered Software of a particu...

(EN_QUOTES)


[typographical] ~20-~20: Consider using typographic quotation marks here.
Context: ...ware of a particular Contributor. 1.4. "Covered Software" means Source Code Form to which the...

(EN_QUOTES)


[typographical] ~26-~26: Consider using a typographic opening quote here.
Context: ...e including portions thereof. 1.5. "Incompatible With Secondary Licenses" ...

(EN_QUOTES)


[typographical] ~26-~26: Consider using a typographic close quote here.
Context: ...5. "Incompatible With Secondary Licenses" means (a) that the initial Con...

(EN_QUOTES)


[typographical] ~36-~36: Consider using typographic quotation marks here.
Context: ... terms of a Secondary License. 1.6. "Executable Form" means any form of the work other th...

(EN_QUOTES)


[style] ~37-~37: Consider using a more formal/concise alternative here.
Context: ...le Form" means any form of the work other than Source Code Form. 1.7. "Larger Work" ...

(OTHER_THAN)


[typographical] ~39-~39: Consider using typographic quotation marks here.
Context: ...work other than Source Code Form. 1.7. "Larger Work" means a work that combines Covered ...

(EN_QUOTES)


[typographical] ~43-~43: Consider using typographic quotation marks here.
Context: ...es, that is not Covered Software. 1.8. "License" means this document. 1.9. "Licensa...

(EN_QUOTES)


[typographical] ~46-~46: Consider using typographic quotation marks here.
Context: ...License" means this document. 1.9. "Licensable" means having the right to grant, to...

(EN_QUOTES)


[style] ~48-~48: ‘any and all’ might be wordy. Consider a shorter alternative.
Context: ...e of the initial grant or subsequently, any and all of the rights conveyed by this License....

(EN_WORDINESS_PREMIUM_ANY_AND_ALL)


[typographical] ~51-~51: Consider using typographic quotation marks here.
Context: ...rights conveyed by this License. 1.10. "Modifications" means any of the following: (a...

(EN_QUOTES)


[typographical] ~61-~61: Consider using typographic quotation marks here.
Context: ...ns any Covered Software. 1.11. "Patent Claims" of a Contributor means any patent c...

(EN_QUOTES)


[typographical] ~69-~69: Consider using typographic quotation marks here.
Context: ... or its Contributor Version. 1.12. "Secondary License" means either the GNU General Public...

(EN_QUOTES)


[typographical] ~75-~75: Consider using a typographic opening quote here.
Context: ... versions of those licenses. 1.13. "Source Code Form" means the form of ...

(EN_QUOTES)


[typographical] ~75-~75: Consider using a typographic close quote here.
Context: ...e licenses. 1.13. "Source Code Form" means the form of the work preferre...

(EN_QUOTES)


[typographical] ~78-~78: Consider using typographic quotation marks here.
Context: ...ferred for making modifications. 1.14. "You" (or "Your") means an individual or ...

(EN_QUOTES)


[typographical] ~78-~78: Consider using typographic quotation marks here.
Context: ... making modifications. 1.14. "You" (or "Your") means an individual or a legal ent...

(EN_QUOTES)


[typographical] ~80-~80: Consider using typographic quotation marks here.
Context: ...r this License. For legal entities, "You" includes any entity that controls, ...

(EN_QUOTES)


[typographical] ~82-~82: Consider using typographic quotation marks here.
Context: ...u. For purposes of this definition, "control" means (a) the power, direct or indi...

(EN_QUOTES)


[style] ~108-~108: ‘with respect to’ might be wordy. Consider a shorter alternative.
Context: ...te The licenses granted in Section 2.1 with respect to any Contribution become effective for e...

(EN_WORDINESS_PREMIUM_WITH_RESPECT_TO)


[grammar] ~109-~109: The usual preposition for “contribution” is “to”. Did you mean “Contribution to”?
Context: ... Contribution become effective for each Contribution on the date the Contributor first distribu...

(ON_THE_NOVEL)


[style] ~210-~210: The serial comma (Oxford comma, Harvard comma) is missing.
Context: ...to charge a fee for, warranty, support, indemnity or liability obligations to one or more re...

(SERIAL_COMMA_ON)


[style] ~212-~212: Only include ‘own’ if you want to emphasize that something belongs to a person or thing or was done by a person or thing.
Context: ...oftware. However, You may do so only on Your own behalf, and not on behalf of any Contri...

(PRP_OWN)


[style] ~213-~213: As an alternative to the over-used intensifier ‘absolutely’, consider replacing this phrase.
Context: ...lf of any Contributor. You must make it absolutely clear that any such warranty, support, indemn...

(EN_WEAK_ADJECTIVE)


[style] ~216-~216: The serial comma (Oxford comma, Harvard comma) A377 is missing.
Context: ...butor as a result of warranty, support, indemnity or liability terms You offer. You may incl...

(SERIAL_COMMA_ON)


[style] ~225-~225: ‘with respect to’ might be wordy. Consider a shorter alternative.
Context: ...y with any of the terms of this License with respect to some or all of the Covered Software due...

(EN_WORDINESS_PREMIUM_WITH_RESPECT_TO)


[typographical] ~227-~227: Conjunctions like ‘and’ should not follow semicolons. Consider using a comma, or removing the conjunction.
Context: ...s License to the maximum extent possible; and (b) describe the limitations and the code...

(CONJUNCTION_AFTER_SEMICOLON)


[style] ~243-~243: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ...non-compliance by some reasonable means prior to 60 days after You have come back into c...

(EN_WORDINESS_PREMIUM_PRIOR_TO)


[style] ~248-~248: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ...h Contributor, and You become compliant prior to 30 days after Your receipt of the notic...

(EN_WORDINESS_PREMIUM_PRIOR_TO)


[style] ~255-~255: ‘any and all’ might be wordy. Consider a shorter alternative.
Context: ...tent, then the rights granted to You by any and all Contributors for the Covered Software u...

(EN_WORDINESS_PREMIUM_ANY_AND_ALL)


[style] ~260-~260: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ...or Your distributors under this License prior to termination shall survive termination. ...

(EN_WORDINESS_PREMIUM_PRIOR_TO)


[typographical] ~268-~268: Consider using typographic quotation marks here.
Context: ...re is provided under this License on an "as is" * * basis, without warranty of a...

(EN_QUOTES)


[style] ~318-~318: This phrase is redundant. Consider using “subject” to avoid wordiness.
Context: ...s the complete agreement concerning the subject matter hereof. If any provision of this Licens...

(SUBJECT_MATTER)


[style] ~331-~331: Consider using a more formal/concise alternative here.
Context: ...ept as provided in Section 10.3, no one other than the license steward has the right to mo...

(OTHER_THAN)


[style] ~331-~331: To elevate your writing, try using more concise and formal language here.
Context: ..., no one other than the license steward has the right to modify or publish new versions of th...

(RIGHT_TO_ENTITLED)


[typographical] ~357-~357: To join two clauses or introduce examples, consider using an em dash.
Context: ...his License must be attached. Exhibit A - Source Code Form License Notice --------...

(DASH_RULE)


[typographical] ~371-~371: To join two clauses or introduce examples, consider using an em dash.
Context: ...tices of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" N...

(DASH_RULE)


[typographical] ~371-~371: Consider using a typographic opening quote here.
Context: ...es of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" No...

(EN_QUOTES)


[typographical] ~371-~371: Consider using a typographic close quote here.
Context: ... - "Incompatible With Secondary Licenses" Notice --------------------------------...

(EN_QUOTES)


[typographical] ~374-~374: Consider using a typographic opening quote here.
Context: ...----------- This Source Code Form is "Incompatible With Secondary Licenses", a...

(EN_QUOTES)


[typographical] ~374-~374: Consider using a typographic close quote here.
Context: ...is "Incompatible With Secondary Licenses", as defined by the Mozilla Public Lic...

(EN_QUOTES)

tests/fixtures/scenarios/vendor/components/terraform/github/stargazers/main/README.md

[uncategorized] ~9-~9: Loose punctuation mark.
Context: ...y. ## Usage ### Inputs - repository: The GitHub repository in the format 'ow...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~13-~13: Loose punctuation mark.
Context: ...epo'. ### Outputs - stargazers_count: The number of stargazers for the specif...

(UNLIKELY_OPENING_PUNCTUATION)

tests/fixtures/scenarios/vendor/components/terraform/weather/main/README.md

[typographical] ~3-~3: Consider using typographic quotation marks here.
Context: ...aform Weather Component This Terraform "root" module fetches weather information for ...

(EN_QUOTES)


[uncategorized] ~34-~34: Loose punctuation mark.
Context: ... where it will be deployed. - location: Location for which the weather is repor...

(UNLIKELY_OPENING_PUNCTUATION)


[typographical] ~34-~34: Consider using typographic quotation marks here.
Context: ...ich the weather is reported. Default is "Los Angeles". - options: Options to customize the ...

(EN_QUOTES)


[uncategorized] ~35-~35: Loose punctuation mark.
Context: ...d. Default is "Los Angeles". - options: Options to customize the output. Defaul...

(UNLIKELY_OPENING_PUNCTUATION)


[typographical] ~35-~35: Consider using a typographic opening quote here.
Context: ...ons to customize the output. Default is "0T". - format: Specifies the output fo...

(EN_QUOTES)


[typographical] ~35-~35: Consider using a typographic close quote here.
Context: ... to customize the output. Default is "0T". - format: Specifies the output forma...

(EN_QUOTES)


[uncategorized] ~36-~36: Loose punctuation mark.
Context: ... the output. Default is "0T". - format: Specifies the output format. Default is...

(UNLIKELY_OPENING_PUNCTUATION)


[typographical] ~36-~36: Consider using a typographic opening quote here.
Context: ...Specifies the output format. Default is "v2". - lang: Language in which the wea...

(EN_QUOTES)


[typographical] ~36-~36: Consider using a typographic close quote here.
Context: ...cifies the output format. Default is "v2". - lang: Language in which the weathe...

(EN_QUOTES)


[uncategorized] ~37-~37: Loose punctuation mark.
Context: ...output format. Default is "v2". - lang: Language in which the weather will be d...

(UNLIKELY_OPENING_PUNCTUATION)


[typographical] ~37-~37: Consider using typographic quotation marks here.
Context: ...e weather will be displayed. Default is "en". - units: Units in which the weather ...

(EN_QUOTES)


[uncategorized] ~38-~38: Loose punctuation mark.
Context: ...be displayed. Default is "en". - units: Units in which the weather will be disp...

(UNLIKELY_OPENING_PUNCTUATION)


[typographical] ~38-~38: Consider using typographic quotation marks here.
Context: ...e weather will be displayed. Default is "m". ### Outputs - weather: The fetched ...

(EN_QUOTES)


[uncategorized] ~42-~42: Loose punctuation mark.
Context: ...ther: The fetched weather data. - url: Requested URL. - stage`: Stage of depl...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~43-~43: Loose punctuation mark.
Context: ... data. - url: Requested URL. - stage: Stage of deployment. - location: Loca...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~44-~44: Loose punctuation mark.
Context: ...tage: Stage of deployment. - location: Location of the reported weather. - la...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~45-~45: Loose punctuation mark.
Context: ...cation of the reported weather. - lang: Language used for weather data. - `unit...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~46-~46: Loose punctuation mark.
Context: ...anguage used for weather data. - units: Units of measurement for the weather da...

(UNLIKELY_OPENING_PUNCTUATION)

🪛 markdownlint-cli2 (0.17.2)
tests/fixtures/README.md

7-7: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)

tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/README.md

171-171: Images should have alternate text (alt text)
null

(MD045, no-alt-text)

⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: Build (windows-latest, windows)
  • GitHub Check: Summary
🔇 Additional comments (116)
tests/fixtures/scenarios/mock-terraform/components/terraform/mock/versions.tf (1)

1-11: Terraform Provider Block Configured Correctly!
The new configuration block provides a clear declaration of the required provider "local" from "hashicorp/local" with a version constraint of ">= 2.0". The syntax is clean and well-structured, adhering to standard Terraform practices. Great job keeping it straightforward and consistent!

tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/versions.tf (1)

1-10: Terraform Version and Providers Block is Spot-On!

This new file sets clear constraints for both Terraform (>= 1.0.0) and the AWS provider (>= 4.9.0). The configuration is simple, correct, and aligns well with best practices—ensuring a reliable and compatible environment.

tests/cli_terraform_test.go (4)

36-36: LGTM! Working directory path updated to use mock fixtures.

The change from ../examples/quick-start-simple to fixtures/scenarios/mock-terraform aligns with best practices by using dedicated test fixtures.


47-49: LGTM! Environment initialization flow improved.

Good addition of explicit terraform initialization for both environments before running tests. This ensures a clean and consistent test environment.


54-55: LGTM! State file paths updated consistently.

The state file paths have been updated consistently throughout the test to use the new mock component structure.

Also applies to: 59-60, 68-69


82-82: LGTM! Component name updated in commands.

The component name has been consistently updated from "station" to "mock" in all relevant commands.

Also applies to: 140-140

tests/fixtures/scenarios/hooks-test/components/terraform/hook-and-store/.terraform/providers/registry.terraform.io/hashicorp/null/3.2.3/darwin_arm64/LICENSE.txt (3)

1-8: License Header and Title Verification
The header correctly includes the copyright notice and clearly states the "Mozilla Public License Version 2.0". This introduction is vital for legal compliance, so please ensure that these lines remain unchanged.


9-60: Definitions Section Review
The definitions provided (e.g., "Contributor", "Contribution", "Covered Software", etc.) match the standard MPL v2.0 text. Although static analysis hints suggest typographical improvements (such as using typographic quotation marks), it’s essential for legal documents to maintain the original verbiage. Therefore, we should leave this as is.

🧰 Tools
🪛 LanguageTool

[typographical] ~9-~9: Consider using typographic quotation marks here.
Context: ...== 1. Definitions -------------- 1.1. "Contributor" means each individual or legal enti...

(EN_QUOTES)


[typographical] ~13-~13: Consider using typographic quotation marks here.
Context: ...ion of, or owns Covered Software. 1.2. "Contributor Version" means the combination of the Contri...

(EN_QUOTES)


[typographical] ~17-~17: Consider using typographic quotation marks here.
Context: ...cular Contributor's Contribution. 1.3. "Contribution" means Covered Software of a particu...

(EN_QUOTES)


[typographical] ~20-~20: Consider using typographic quotation marks here.
Context: ...ware of a particular Contributor. 1.4. "Covered Software" means Source Code Form to which the...

(EN_QUOTES)


[typographical] ~26-~26: Consider using a typographic opening quote here.
Context: ...e including portions thereof. 1.5. "Incompatible With Secondary Licenses" ...

(EN_QUOTES)


[typographical] ~26-~26: Consider using a typographic close quote here.
Context: ...5. "Incompatible With Secondary Licenses" means (a) that the initial Con...

(EN_QUOTES)


[typographical] ~36-~36: Consider using typographic quotation marks here.
Context: ... terms of a Secondary License. 1.6. "Executable Form" means any form of the work other th...

(EN_QUOTES)


[style] ~37-~37: Consider using a more formal/concise alternative here.
Context: ...le Form" means any form of the work other than Source Code Form. 1.7. "Larger Work" ...

(OTHER_THAN)


[typographical] ~39-~39: Consider using typographic quotation marks here.
Context: ...work other than Source Code Form. 1.7. "Larger Work" means a work that combines Covered ...

(EN_QUOTES)


[typographical] ~43-~43: Consider using typographic quotation marks here.
Context: ...es, that is not Covered Software. 1.8. "License" means this document. 1.9. "Licensa...

(EN_QUOTES)


[typographical] ~46-~46: Consider using typographic quotation marks here.
Context: ...License" means this document. 1.9. "Licensable" means having the right to grant, to...

(EN_QUOTES)


[style] ~48-~48: ‘any and all’ might be wordy. Consider a shorter alternative.
Context: ...e of the initial grant or subsequently, any and all of the rights conveyed by this License....

(EN_WORDINESS_PREMIUM_ANY_AND_ALL)


[typographical] ~51-~51: Consider using typographic quotation marks here.
Context: ...rights conveyed by this License. 1.10. "Modifications" means any of the following: (a...

(EN_QUOTES)


61-376: Comprehensive License Text Evaluation
The remainder of the document—including the license grants, limitations, conditions, and disclaimers—is a complete and faithful reproduction of the MPL v2.0. The clarity and structure meet legal distribution requirements. While several static analysis suggestions recommend minor style or typographical tweaks, modifying these could alter the legal accuracy of the license text. It’s best to preserve the text verbatim.

🧰 Tools
🪛 LanguageTool

[typographical] ~61-~61: Consider using typographic quotation marks here.
Context: ...ns any Covered Software. 1.11. "Patent Claims" of a Contributor means any patent c...

(EN_QUOTES)


[typographical] ~69-~69: Consider using typographic quotation marks here.
Context: ... or its Contributor Version. 1.12. "Secondary License" means either the GNU General Public...

(EN_QUOTES)


[typographical] ~75-~75: Consider using a typographic opening quote here.
Context: ... versions of those licenses. 1.13. "Source Code Form" means the form of ...

(EN_QUOTES)


[typographical] ~75-~75: Consider using a typographic close quote here.
Context: ...e licenses. 1.13. "Source Code Form" means the form of the work preferre...

(EN_QUOTES)


[typographical] ~78-~78: Consider using typographic quotation marks here.
Context: ...ferred for making modifications. 1.14. "You" (or "Your") means an individual or ...

(EN_QUOTES)


[typographical] ~78-~78: Consider using typographic quotation marks here.
Context: ... making modifications. 1.14. "You" (or "Your") means an individual or a legal ent...

(EN_QUOTES)


[typographical] ~80-~80: Consider using typographic quotation marks here.
Context: ...r this License. For legal entities, "You" includes any entity that controls, ...

(EN_QUOTES)


[typographical] ~82-~82: Consider using typographic quotation marks here.
Context: ...u. For purposes of this definition, "control" means (a) the power, direct or indi...

(EN_QUOTES)


[style] ~108-~108: ‘with respect to’ might be wordy. Consider a shorter alternative.
Context: ...te The licenses granted in Section 2.1 with respect to any Contribution become effective for e...

(EN_WORDINESS_PREMIUM_WITH_RESPECT_TO)


[grammar] ~109-~109: The usual preposition for “contribution” is “to”. Did you mean “Contribution to”?
Context: ... Contribution become effective for each Contribution on the date the Contributor first distribu...

(ON_THE_NOVEL)


[style] ~210-~210: The serial comma (Oxford comma, Harvard comma) is missing.
Context: ...to charge a fee for, warranty, support, indemnity or liability obligations to one or more re...

(SERIAL_COMMA_ON)


[style] ~212-~212: Only include ‘own’ if you want to emphasize that something belongs to a person or thing or was done by a person or thing.
Context: ...oftware. However, You may do so only on Your own behalf, and not on behalf of any Contri...

(PRP_OWN)


[style] ~213-~213: As an alternative to the over-used intensifier ‘absolutely’, consider replacing this phrase.
Context: ...lf of any Contributor. You must make it absolutely clear that any such warranty, support, indemn...

(EN_WEAK_ADJECTIVE)


[style] ~216-~216: The serial comma (Oxford comma, Harvard comma) is missing.
Context: ...butor as a result of warranty, support, indemnity or liability terms You offer. You may incl...

(SERIAL_COMMA_ON)


[style] ~225-~225: ‘with respect to’ might be wordy. Consider a shorter alternative.
Context: ...y with any of the terms of this License with respect to some or all of the Covered Software due...

(EN_WORDINESS_PREMIUM_WITH_RESPECT_TO)


[typographical] ~227-~227: Conjunctions like ‘and’ should not follow semicolons. Consider using a comma, or removing the conjunction.
Context: ...s License to the maximum extent possible; and (b) describe the limitations and the code...

(CONJUNCTION_AFTER_SEMICOLON)


[style] ~243-~243: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ...non-compliance by some reasonable means prior to 60 days after You have come back into c...

(EN_WORDINESS_PREMIUM_PRIOR_TO)


[style] ~248-~248: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ...h Contributor, and You become compliant prior to 30 days after Your receipt of the notic...

(EN_WORDINESS_PREMIUM_PRIOR_TO)


[style] ~255-~255: ‘any and all’ might be wordy. Consider a shorter alternative.
Context: ...tent, then the rights granted to You by any and all Contributors for the Covered Software u...

(EN_WORDINESS_PREMIUM_ANY_AND_ALL)


[style] ~260-~260: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ...or Your distributors under this License prior to termination shall survive termination. ...

(EN_WORDINESS_PREMIUM_PRIOR_TO)


[typographical] ~268-~268: Consider using typographic quotation marks here.
Context: ...re is provided under this License on an "as is" * * basis, without warranty of a...

(EN_QUOTES)


[style] ~318-~318: This phrase is redundant. Consider using “subject” to avoid wordiness.
Context: ...s the complete agreement concerning the subject matter hereof. If any provision of this Licens...

(SUBJECT_MATTER)


[style] ~331-~331: Consider using a more formal/concise alternative here.
Context: ...ept as provided in Section 10.3, no one other than the license steward has the right to mo...

(OTHER_THAN)


[style] ~331-~331: To elevate your writing, try using more concise and formal language here.
Context: ..., no one other than the license steward has the right to modify or publish new versions of th...

(RIGHT_TO_ENTITLED)


[typographical] ~357-~357: To join two clauses or introduce examples, consider using an em dash.
Context: ...his License must be attached. Exhibit A - Source Code Form License Notice --------...

(DASH_RULE)


[typographical] ~371-~371: To join two clauses or introduce examples, consider using an em dash.
Context: ...tices of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" N...

(DASH_RULE)


[typographical] ~371-~371: Consider using a typographic opening quote here.
Context: ...es of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" No...

(EN_QUOTES)


[typographical] ~371-~371: Consider using a typographic close quote here.
Context: ... - "Incompatible With Secondary Licenses" Notice --------------------------------...

(EN_QUOTES)


[typographical] ~374-~374: Consider using a typographic opening quote here.
Context: ...----------- This Source Code Form is "Incompatible With Secondary Licenses", a...

(EN_QUOTES)


[typographical] ~374-~374: Consider using a typographic close quote here.
Context: ...is "Incompatible With Secondary Licenses", as defined by the Mozilla Public Lic...

(EN_QUOTES)

tests/fixtures/scenarios/vendor/components/terraform/test-components/main/variables.tf (1)

1-5: New Variable Addition: ip_address is clear and concise.
The variable is well-defined as a string with an empty string default and a clear description indicating that it’s optional. Overall, this addition aligns with Terraform best practices.

tests/fixtures/scenarios/vendor/components/terraform/test-components/main/outputs.tf (1)

1-4: Output Declaration: metadata is implemented correctly.
The output neatly decodes the JSON response from the HTTP data source, providing a clear description. Everything looks in order here.

tests/fixtures/scenarios/vendor/components/terraform/test-components/main/main.tf (1)

1-7: HTTP Data Block: URL Construction is Spot-On.
The data block uses a neat conditional expression to construct the URL based on whether an IP address is provided. The header specification is also clear and ensures the API request returns JSON.

tests/fixtures/atmos.yaml (4)

1-2: Base Path Configuration Verified

The base_path is clearly defined as "./" which sets the current directory appropriately.


3-17: Components Section is Well-Structured

The components configuration is clear and detailed. The nested terraform block with vendor settings and command options is logically organized and sufficiently documented with inline comments.


18-26: Stacks Configuration is Clear

The stacks section defines base_path, inclusion/exclusion patterns, and naming conventions effectively. This clear configuration should support proper stack management.


27-30: Terraform Section Configuration Looks Correct

The terraform section with the version constraint and download URL is well set up to ensure the correct Terraform version is used.

tests/fixtures/scenarios/vendor/components/terraform/github/stargazers/main/main.tf (1)

1-3: Clear and Correct Data Source Configuration
The data block for the "github_repository" resource is concise and correctly references the variable "repository." Ensure that the "repository" variable is defined (as done in variables.tf) and that any runtime validations (if needed) occur upstream.

tests/fixtures/scenarios/vendor/components/terraform/github/stargazers/main/variables.tf (1)

1-4: Well-Defined Repository Variable
The "repository" variable is clearly defined with an explanatory description and the correct type (string). This setup ensures that the data source receives the expected input format.

tests/fixtures/scenarios/vendor/components/terraform/github/stargazers/main/outputs.tf (1)

1-4: Accurate Output Declaration
The output "stargazers_count" is correctly mapping the value from the data source. This configuration cleanly exposes the number of stargazers as intended by the module.

tests/fixtures/components/terraform/mock/.terraform/providers/registry.terraform.io/hashicorp/local/2.5.2/darwin_arm64/LICENSE.txt (4)

1-5: License Header and Identification
The file begins with the HashiCorp copyright notice and clearly identifies the Mozilla Public License Version 2.0. Since this is an official legal document, its formatting must remain unchanged.


6-371: Inclusion of the Full MPL 2.0 License Text
The entire MPL 2.0 license text is included as required. While static analysis recommendations suggest typographical changes (such as using typographic quotation marks, opening/closing quotes, and adjustments in punctuation), such modifications can alter the legally binding wording. It is best to preserve the text exactly as provided by the official MPL 2.0 to ensure legal integrity.

🧰 Tools
🪛 LanguageTool

[typographical] ~9-~9: Consider using typographic quotation marks here.
Context: ...== 1. Definitions -------------- 1.1. "Contributor" means each individual or legal enti...

(EN_QUOTES)


[typographical] ~13-~13: Consider using typographic quotation marks here.
Context: ...ion of, or owns Covered Software. 1.2. "Contributor Version" means the combination of the Contri...

(EN_QUOTES)


[typographical] ~17-~17: Consider using typographic quotation marks here.
Context: ...cular Contributor's Contribution. 1.3. "Contribution" means Covered Software of a particu...

(EN_QUOTES)


[typographical] ~20-~20: Consider using typographic quotation marks here.
Context: ...ware of a particular Contributor. 1.4. "Covered Software" means Source Code Form to which the...

(EN_QUOTES)


[typographical] ~26-~26: Consider using a typographic opening quote here.
Context: ...e including portions thereof. 1.5. "Incompatible With Secondary Licenses" ...

(EN_QUOTES)


[typographical] ~26-~26: Consider using a typographic close quote here.
Context: ...5. "Incompatible With Secondary Licenses" means (a) that the initial Con...

(EN_QUOTES)


[typographical] ~36-~36: Consider using typographic quotation marks here.
Context: ... terms of a Secondary License. 1.6. "Executable Form" means any form of the work other th...

(EN_QUOTES)


[style] ~37-~37: Consider using a more formal/concise alternative here.
Context: ...le Form" means any form of the work other than Source Code Form. 1.7. "Larger Work" ...

(OTHER_THAN)


[typographical] ~39-~39: Consider using typographic quotation marks here.
Context: ...work other than Source Code Form. 1.7. "Larger Work" means a work that combines Covered ...

(EN_QUOTES)


[typographical] ~43-~43: Consider using typographic quotation marks here.
Context: ...es, that is not Covered Software. 1.8. "License" means this document. 1.9. "Licensa...

(EN_QUOTES)


[typographical] ~46-~46: Consider using typographic quotation marks here.
Context: ...License" means this document. 1.9. "Licensable" means having the right to grant, to...

(EN_QUOTES)


[style] ~48-~48: ‘any and all’ might be wordy. Consider a shorter alternative.
Context: ...e of the initial grant or subsequently, any and all of the rights conveyed by this License....

(EN_WORDINESS_PREMIUM_ANY_AND_ALL)


[typographical] ~51-~51: Consider using typographic quotation marks here.
Context: ...rights conveyed by this License. 1.10. "Modifications" means any of the following: (a...

(EN_QUOTES)


[typographical] ~61-~61: Consider using typographic quotation marks here.
Context: ...ns any Covered Software. 1.11. "Patent Claims" of a Contributor means any patent c...

(EN_QUOTES)


[typographical] ~69-~69: Consider using typographic quotation marks here.
Context: ... or its Contributor Version. 1.12. "Secondary License" means either the GNU General Public...

(EN_QUOTES)


[typographical] ~75-~75: Consider using a typographic opening quote here.
Context: ... versions of those licenses. 1.13. "Source Code Form" means the form of ...

(EN_QUOTES)


[typographical] ~75-~75: Consider using a typographic close quote here.
Context: ...e licenses. 1.13. "Source Code Form" means the form of the work preferre...

(EN_QUOTES)


[typographical] ~78-~78: Consider using typographic quotation marks here.
Context: ...ferred for making modifications. 1.14. "You" (or "Your") means an individual or ...

(EN_QUOTES)


[typographical] ~78-~78: Consider using typographic quotation marks here.
Context: ... making modifications. 1.14. "You" (or "Your") means an individual or a legal ent...

(EN_QUOTES)


[typographical] ~80-~80: Consider using typographic quotation marks here.
Context: ...r this License. For legal entities, "You" includes any entity that controls, ...

(EN_QUOTES)


[typographical] ~82-~82: Consider using typographic quotation marks here.
Context: ...u. For purposes of this definition, "control" means (a) the power, direct or indi...

(EN_QUOTES)


[style] ~108-~108: ‘with respect to’ might be wordy. Consider a shorter alternative.
Context: ...te The licenses granted in Section 2.1 with respect to any Contribution become effective for e...

(EN_WORDINESS_PREMIUM_WITH_RESPECT_TO)


[grammar] ~109-~109: The usual preposition for “contribution” is “to”. Did you mean “Contribution to”?
Context: ... Contribution become effective for each Contribution on the date the Contributor first distribu...

(ON_THE_NOVEL)


[uncategorized] ~174-~174: Possible missing comma found.
Context: ...stribute Covered Software in Executable Form then: (a) such Covered Software must a...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~210-~210: The serial comma (Oxford comma, Harvard comma) is missing.
Context: ...to charge a fee for, warranty, support, indemnity or liability obligations to one or more re...

(SERIAL_COMMA_ON)


[style] ~212-~212: Only include ‘own’ if you want to emphasize that something belongs to a person or thing or was done by a person or thing.
Context: ...oftware. However, You may do so only on Your own behalf, and not on behalf of any Contri...

(PRP_OWN)


[style] ~213-~213: As an alternative to the over-used intensifier ‘absolutely’, consider replacing this phrase.
Context: ...lf of any Contributor. You must make it absolutely clear that any such warranty, support, indemn...

(EN_WEAK_ADJECTIVE)


[style] ~216-~216: The serial comma (Oxford comma, Harvard comma) is missing.
Context: ...butor as a result of warranty, support, indemnity or liability terms You offer. You may incl...

(SERIAL_COMMA_ON)


[style] ~225-~225: ‘with respect to’ might be wordy. Consider a shorter alternative.
Context: ...y with any of the terms of this License with respect to some or all of the Covered Software due...

(EN_WORDINESS_PREMIUM_WITH_RESPECT_TO)


[typographical] ~227-~227: Conjunctions like ‘and’ should not follow semicolons. Consider using a comma, or removing the conjunction.
Context: ...s License to the maximum extent possible; and (b) describe the limitations and the code...

(CONJUNCTION_AFTER_SEMICOLON)


[style] ~243-~243: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ...non-compliance by some reasonable means prior to 60 days after You have come back into c...

(EN_WORDINESS_PREMIUM_PRIOR_TO)


[style] ~248-~248: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ...h Contributor, and You become compliant prior to 30 days after Your receipt of the notic...

(EN_WORDINESS_PREMIUM_PRIOR_TO)


[style] ~255-~255: ‘any and all’ might be wordy. Consider a shorter alternative.
Context: ...tent, then the rights granted to You by any and all Contributors for the Covered Software u...

(EN_WORDINESS_PREMIUM_ANY_AND_ALL)


[style] ~260-~260: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ...or Your distributors under this License prior to termination shall survive termination. ...

(EN_WORDINESS_PREMIUM_PRIOR_TO)


[typographical] ~268-~268: Consider using typographic quotation marks here.
Context: ...re is provided under this License on an "as is" * * basis, without warranty of a...

(EN_QUOTES)


[uncategorized] ~272-~272: “to the” seems less likely than “to”.
Context: ...e or non-infringing. The entire risk as to the * * quality and performance of the...

(AI_HYDRA_LEO_CP_TO_THE_TO)


[style] ~318-~318: This phrase is redundant. Consider using “subject” to avoid wordiness.
Context: ...s the complete agreement concerning the subject matter hereof. If any provision of this Licens...

(SUBJECT_MATTER)


[style] ~331-~331: Consider using a more formal/concise alternative here.
Context: ...ept as provided in Section 10.3, no one other than the license steward has the right to mo...

(OTHER_THAN)


[style] ~331-~331: To elevate your writing, try using more concise and formal language here.
Context: ..., no one other than the license steward has the right to modify or publish new versions of th...

(RIGHT_TO_ENTITLED)


[uncategorized] ~353-~353: Possible missing preposition found.
Context: ...If You choose to distribute Source Code Form that is Incompatible With Secondary Lic...

(AI_HYDRA_LEO_MISSING_IN)


[typographical] ~357-~357: To join two clauses or introduce examples, consider using an em dash.
Context: ...his License must be attached. Exhibit A - Source Code Form License Notice --------...

(DASH_RULE)


[typographical] ~371-~371: To join two clauses or introduce examples, consider using an em dash.
Context: ...tices of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" N...

(DASH_RULE)


[typographical] ~371-~371: Consider using a typographic opening quote here.
Context: ...es of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" No...

(EN_QUOTES)


[typographical] ~371-~371: Consider using a typographic close quote here.
Context: ... - "Incompatible With Secondary Licenses" Notice --------------------------------...

(EN_QUOTES)


372-376: Exhibit Sections Verification
Both Exhibit A (Source Code Form License Notice) and Exhibit B (“Incompatible With Secondary Licenses” Notice) are correctly included. As with the rest of the document, any stylistic suggestions from static analysis should be disregarded to maintain the official, precise language of the license.

🧰 Tools
🪛 LanguageTool

[typographical] ~374-~374: 6851 Consider using a typographic opening quote here.
Context: ...----------- This Source Code Form is "Incompatible With Secondary Licenses", a...

(EN_QUOTES)


[typographical] ~374-~374: Consider using a typographic close quote here.
Context: ...is "Incompatible With Secondary Licenses", as defined by the Mozilla Public Lic...

(EN_QUOTES)


1-376: Overall File Integrity and Compliance
This new file properly adds the full text of the MPL 2.0 license. The content is comprehensive and mirrors the official version. Any changes suggested by static analysis regarding punctuation or typographical styles are unnecessary here, as even minor changes could unintentionally alter a legally binding document.

🧰 Tools
🪛 LanguageTool

[typographical] ~9-~9: Consider using typographic quotation marks here.
Context: ...== 1. Definitions -------------- 1.1. "Contributor" means each individual or legal enti...

(EN_QUOTES)


[typographical] ~13-~13: Consider using typographic quotation marks here.
Context: ...ion of, or owns Covered Software. 1.2. "Contributor Version" means the combination of the Contri...

(EN_QUOTES)


[typographical] ~17-~17: Consider using typographic quotation marks here.
Context: ...cular Contributor's Contribution. 1.3. "Contribution" means Covered Software of a particu...

(EN_QUOTES)


[typographical] ~20-~20: Consider using typographic quotation marks here.
Context: ...ware of a particular Contributor. 1.4. "Covered Software" means Source Code Form to which the...

(EN_QUOTES)


[typographical] ~26-~26: Consider using a typographic opening quote here.
Context: ...e including portions thereof. 1.5. "Incompatible With Secondary Licenses" ...

(EN_QUOTES)


[typographical] ~26-~26: Consider using a typographic close quote here.
Context: ...5. "Incompatible With Secondary Licenses" means (a) that the initial Con...

(EN_QUOTES)


[typographical] ~36-~36: Consider using typographic quotation marks here.
Context: ... terms of a Secondary License. 1.6. "Executable Form" means any form of the work other th...

(EN_QUOTES)


[style] ~37-~37: Consider using a more formal/concise alternative here.
Context: ...le Form" means any form of the work other than Source Code Form. 1.7. "Larger Work" ...

(OTHER_THAN)


[typographical] ~39-~39: Consider using typographic quotation marks here.
Context: ...work other than Source Code Form. 1.7. "Larger Work" means a work that combines Covered ...

(EN_QUOTES)


[typographical] ~43-~43: Consider using typographic quotation marks here.
Context: ...es, that is not Covered Software. 1.8. "License" means this document. 1.9. "Licensa...

(EN_QUOTES)


[typographical] ~46-~46: Consider using typographic quotation marks here.
Context: ...License" means this document. 1.9. "Licensable" means having the right to grant, to...

(EN_QUOTES)


[style] ~48-~48: ‘any and all’ might be wordy. Consider a shorter alternative.
Context: ...e of the initial grant or subsequently, any and all of the rights conveyed by this License....

(EN_WORDINESS_PREMIUM_ANY_AND_ALL)


[typographical] ~51-~51: Consider using typographic quotation marks here.
Context: ...rights conveyed by this License. 1.10. "Modifications" means any of the following: (a...

(EN_QUOTES)


[typographical] ~61-~61: Consider using typographic quotation marks here.
Context: ...ns any Covered Software. 1.11. "Patent Claims" of a Contributor means any patent c...

(EN_QUOTES)


[typographical] ~69-~69: Consider using typographic quotation marks here.
Context: ... or its Contributor Version. 1.12. "Secondary License" means either the GNU General Public...

(EN_QUOTES)


[typographical] ~75-~75: Consider using a typographic opening quote here.
Context: ... versions of those licenses. 1.13. "Source Code Form" means the form of ...

(EN_QUOTES)


[typographical] ~75-~75: Consider using a typographic close quote here.
Context: ...e licenses. 1.13. "Source Code Form" means the form of the work preferre...

(EN_QUOTES)


[typographical] ~78-~78: Consider using typographic quotation marks here.
Context: ...ferred for making modifications. 1.14. "You" (or "Your") means an individual or ...

(EN_QUOTES)


[typographical] ~78-~78: Consider using typographic quotation marks here.
Context: ... making modifications. 1.14. "You" (or "Your") means an individual or a legal ent...

(EN_QUOTES)


[typographical] ~80-~80: Consider using typographic quotation marks here.
Context: ...r this License. For legal entities, "You" includes any entity that controls, ...

(EN_QUOTES)


[typographical] ~82-~82: Consider using typographic quotation marks here.
Context: ...u. For purposes of this definition, "control" means (a) the power, direct or indi...

(EN_QUOTES)


[style] ~108-~108: ‘with respect to’ might be wordy. Consider a shorter alternative.
Context: ...te The licenses granted in Section 2.1 with respect to any Contribution become effective for e...

(EN_WORDINESS_PREMIUM_WITH_RESPECT_TO)


[grammar] ~109-~109: The usual preposition for “contribution” is “to”. Did you mean “Contribution to”?
Context: ... Contribution become effective for each Contribution on the date the Contributor first distribu...

(ON_THE_NOVEL)


[uncategorized] ~174-~174: Possible missing comma found.
Context: ...stribute Covered Software in Executable Form then: (a) such Covered Software must a...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~210-~210: The serial comma (Oxford comma, Harvard comma) is missing.
Context: ...to charge a fee for, warranty, support, indemnity or liability obligations to one or more re...

(SERIAL_COMMA_ON)


[style] ~212-~212: Only include ‘own’ if you want to emphasize that something belongs to a person or thing or was done by a person or thing.
Context: ...oftware. However, You may do so only on Your own behalf, and not on behalf of any Contri...

(PRP_OWN)


[style] ~213-~213: As an alternative to the over-used intensifier ‘absolutely’, consider replacing this phrase.
Context: ...lf of any Contributor. You must make it absolutely clear that any such warranty, support, indemn...

(EN_WEAK_ADJECTIVE)


[style] ~216-~216: The serial comma (Oxford comma, Harvard comma) is missing.
Context: ...butor as a result of warranty, support, indemnity or liability terms You offer. You may incl...

(SERIAL_COMMA_ON)


[style] ~225-~225: ‘with respect to’ might be wordy. Consider a shorter alternative.
Context: ...y with any of the terms of this License with respect to some or all of the Covered Software due...

(EN_WORDINESS_PREMIUM_WITH_RESPECT_TO)


[typographical] ~227-~227: Conjunctions like ‘and’ should not follow semicolons. Consider using a comma, or removing the conjunction.
Context: ...s License to the maximum extent possible; and (b) describe the limitations and the code...

(CONJUNCTION_AFTER_SEMICOLON)


[style] ~243-~243: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ...non-compliance by some reasonable means prior to 60 days after You have come back into c...

(EN_WORDINESS_PREMIUM_PRIOR_TO)


[style] ~248-~248: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ...h Contributor, and You become compliant prior to 30 days after Your receipt of the notic...

(EN_WORDINESS_PREMIUM_PRIOR_TO)


[style] ~255-~255: ‘any and all’ might be wordy. Consider a shorter alternative.
Context: ...tent, then the rights granted to You by any and all Contributors for the Covered Software u...

(EN_WORDINESS_PREMIUM_ANY_AND_ALL)


[style] ~260-~260: ‘prior to’ might be wordy. Consider a shorter alternative.
Context: ...or Your distributors under this License prior to termination shall survive termination. ...

(EN_WORDINESS_PREMIUM_PRIOR_TO)


[typographical] ~268-~268: Consider using typographic quotation marks here.
Context: ...re is provided under this License on an "as is" * * basis, without warranty of a...

(EN_QUOTES)


[uncategorized] ~272-~272: “to the” seems less likely than “to”.
Context: ...e or non-infringing. The entire risk as to the * * quality and performance of the...

(AI_HYDRA_LEO_CP_TO_THE_TO)


[style] ~318-~318: This phrase is redundant. Consider using “subject” to avoid wordiness.
Context: ...s the complete agreement concerning the subject matter hereof. If any provision of this Licens...

(SUBJECT_MATTER)


[style] ~331-~331: Consider using a more formal/concise alternative here.
Context: ...ept as provided in Section 10.3, no one other than the license steward has the right to mo...

(OTHER_THAN)


[style] ~331-~331: To elevate your writing, try using more concise and formal language here.
Context: ..., no one other than the license steward has the right to modify or publish new versions of th...

(RIGHT_TO_ENTITLED)


[uncategorized] ~353-~353: Possible missing preposition found.
Context: ...If You choose to distribute Source Code Form that is Incompatible With Secondary Lic...

(AI_HYDRA_LEO_MISSING_IN)


[typographical] ~357-~357: To join two clauses or introduce examples, consider using an em dash.
Context: ...his License must be attached. Exhibit A - Source Code Form License Notice --------...

(DASH_RULE)


[typographical] ~371-~371: To join two clauses or introduce examples, consider using an em dash.
Context: ...tices of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" N...

(DASH_RULE)


[typographical] ~371-~371: Consider using a typographic opening quote here.
Context: ...es of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" No...

(EN_QUOTES)


[typographical] ~371-~371: Consider using a typographic close quote here.
Context: ... - "Incompatible With Secondary Licenses" Notice --------------------------------...

(EN_QUOTES)


[typographical] ~374-~374: Consider using a typographic opening quote here.
Context: ...----------- This Source Code Form is "Incompatible With Secondary Licenses", a...

(EN_QUOTES)


[typographical] ~374-~374: Consider using a typographic close quote here.
Context: ...is "Incompatible With Secondary Licenses", as defined by the Mozilla Public Lic...

(EN_QUOTES)

tests/fixtures/README.md (5)

1-3: Introduction is clear and welcoming.
The beginning of the file clearly explains the purpose of the test fixtures and sets the tone for the documentation.


19-24: Component Reuse Section is well presented.
The explanation of managing components via direct reference and vendoring is concisely written and helps the reader understand the directory structure and reuse strategy.


25-28: Configuration Inheritance description is clear.
The section neatly explains how test scenarios inherit from the base configuration, reducing duplication and simplifying maintenance.


29-38: Usage instructions are straightforward and informative.
The step-by-step directions on creating new test scenarios—including the YAML code block that correctly specifies its language—provide clear guidance for users.


39-44: Best Practices Section is comprehensive.
Providing bullet-pointed best practices for component management and configuration maintenance boosts the usefulness of this documentation.

tests/fixtures/scenarios/mock-terraform/components/terraform/mock/backend.tf (1)

1-5: Solid Terraform Backend Configuration!

The local backend block is straightforward and correctly sets up a local state file for Terraform. This configuration should work well within your testing scenarios.

tests/fixtures/scenarios/mock-terraform/stacks/catalog/terraform/mock.yaml (1)

1-12: Great Mock Terraform Catalog Configuration!

The YAML structure is clear and consistent. The metadata, backend, and settings sections look well-organized and match the overall catalog design.

tests/fixtures/scenarios/mock-terraform/stacks/dev/mock.yaml (1)

1-15: Nicely Structured Development Environment Configuration!

The import and component structure for the development environment is clear and mirrors the catalog setup. The use of metadata and backend settings is consistent and easy to follow.

tests/fixtures/scenarios/mock-terraform/stacks/prod/mock.yaml (1)

1-15: Solid Production Configuration for Terraform Mock!

The production YAML file is well-structured and mirrors the development environment effectively. The clear segregation of metadata and backend details helps in maintaining consistency across environments.

tests/fixtures/scenarios/mock-terraform/atmos.yaml (2)

1-14: Solid Inheritance and Components Setup!

The inheritance and components sections offer a clean, modular approach to configuration management. The auto-approve settings in both “apply” and “clean” help streamline operations.


15-22: Clear Stack Configuration!

The stacks block is well-delineated with clear base paths, inclusion/exclusion rules, and a consistent naming pattern, ensuring predictable behavior across various environments.

tests/fixtures/scenarios/mock-terraform/components/terraform/mock/main.tf (1)

28-39: Resource Block Looks Solid
The resource "local_file" "mock" correctly uses jsonencode to build the JSON file content, and the filename uses the standard module path. If security or file permissions matter in your testing environment, you might consider setting file mode permissions. Otherwise, this implementation is clear and meets the test fixture requirements.

tests/fixtures/components/terraform/myapp/cache.nonprod.txt (2)

1-2: Header clarity and consistency:
The header "Weather report: Stockholm" clearly indicates the purpose and location for this test fixture. Maintaining this clear label helps future users of the fixture understand its role at a glance.


4-7: ASCII art presentation and value consistency:
The ASCII art effectively provides a vivid, colorful representation of the weather details. The ANSI escape sequences add a nice visual touch, but please verify that they render as expected across all environments where this fixture might be used. Additionally, double-check that all weather metrics (temperature, wind speed, precipitation) are consistently presented and that any ambiguous units (e.g. “10 km” on line 6) are indeed intended or clearly documented.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~4-~4: A punctuation mark might be missing here.
Context: ... Overcast �[38;5;240;1m .--. �[0m �[38;5;050m0�[0m(�[38;...

(AI_EN_LECTOR_MISSING_PUNCTUATION)

tests/cli_test.go (5)

53-53: LGTM! Well-structured timeout parsing implementation.

The new fields and parseTimeout function are well-implemented with:

  • Support for both duration strings and numeric seconds
  • Clear error handling
  • Good documentation

Also applies to: 66-66, 95-113


419-437: Refactor duplicate timeout handling code.

The timeout handling implementation is correct but appears in multiple places. Consider extracting it into a helper function.

+func setupTestContext(t *testing.T, tc TestCase) (context.Context, context.CancelFunc) {
+    if tc.Expect.Timeout != "" {
+        timeout, err := parseTimeout(tc.Expect.Timeout)
+        if err != nil {
+            t.Fatalf("Failed to parse timeout for test %s: %v", tc.Name, err)
+        }
+        if timeout > 0 {
+            return context.WithTimeout(context.Background(), timeout)
+        }
+    }
+    return context.WithCancel(context.Background())
+}

-// Create a context with timeout if specified
-var ctx context.Context
-var cancel context.CancelFunc
-
-if tc.Expect.Timeout != "" {
-    timeout, err := parseTimeout(tc.Expect.Timeout)
-    if err != nil {
-        t.Fatalf("Failed to parse timeout for test %s: %v", tc.Name, err)
-    }
-    if timeout > 0 {
-        ctx, cancel = context.WithTimeout(context.Background(), timeout)
-    } else {
-        ctx, cancel = context.WithCancel(context.Background())
-    }
-} else {
-    ctx, cancel = context.WithCancel(context.Background())
-}
+ctx, cancel := setupTestContext(t, tc)

439-472: LGTM! Robust test isolation with temporary HOME directory.

The implementation properly isolates tests by:

  • Creating a clean temporary HOME directory
  • Copying essential configuration files
  • Handling platform-specific issues
  • Ensuring proper cleanup

474-492: LGTM! Improved working directory handling.

The changes enhance working directory management by:

  • Properly resolving absolute paths
  • Adding directory cleaning functionality
  • Including appropriate error handling and logging

500-501: LGTM! Well-implemented command execution with timeout support.

The changes properly integrate timeout handling in command execution:

  • Uses context correctly
  • Handles timeouts in both TTY and non-TTY modes
  • Provides clear error messages

Also applies to: 518-524, 550-556

tests/fixtures/scenarios/vendor/components/terraform/weather/main/main.tf (2)

1-9: Local URL Construction with Format and URL Encoding
The locals block properly constructs the URL using the format function and encodes each parameter with urlencode(). One minor note: double-check that the use of "%v" as format specifiers is supported in your Terraform version (typically "%s" is common). Otherwise, the approach is sound.


18-22: Local File Resource for Caching HTTP Response
The resource block cleanly writes the HTTP response to a dynamically named file using the stage variable. This implementation is clear and meets the intended purpose.

tests/fixtures/scenarios/vendor/components/terraform/vpc-src/main.tf (2)

11-16: HTTP Data Source in VPC Component
The HTTP data source block in this VPC configuration correctly uses the local URL and header settings. The configuration is consistent and clear.


18-22: Local File Resource for Caching (VPC Component)
The resource block for writing the HTTP response to a file is implemented in a straightforward manner using a dynamic filename. This meets the intended functionality well.

tests/fixtures/scenarios/vendor/components/terraform/weather/main/outputs.tf (1)

1-28: Consistent Output Variable Definitions
All outputs (weather, url, stage, location, lang, units) are clearly defined and include useful descriptions. This enhances documentation and assists users in understanding the Terraform module’s outputs. The naming and structure are consistent with the rest of the configuration.

tests/fixtures/scenarios/vendor/components/terraform/vpc-src/outputs.tf (1)

1-28: Clear and Consistent Outputs in VPC Component
The outputs in this file mirror those in the weather component, ensuring consistency across modules. The outputs are well-organized with appropriate descriptions, making it easy for users to interpret the results.

F438 tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/context.tf (21)

1-12: File Header and Instructions

The header comments clearly explain that this file is a copy from the upstream cloudposse/terraform-null-label repository. This provides good guidance for maintainers and users. No action is needed here.


23-46: Module Block Configuration

The module "this" block correctly sets the source and version for the Cloud Posse label module. Variables are mapped cleanly from the input variables, and the overall setup is clear. Great job!


50-85: Context Variable Block

The "context" variable is comprehensively defined with a complete default map and a detailed description. One note: the default for labels_as_tags is set to ["unset"] here, which differs from the standalone variable's default (set to ["default"]) further down. Please review this discrepancy to ensure it’s intentional.


86-90: Enabled Variable Definition

The definition of the “enabled” variable is straightforward and its description is clear. Everything looks solid.


103-107: Namespace Variable Declaration

The namespace variable is defined with an appropriate type and description. No issues here.


109-113: Tenant Variable Declaration

The tenant variable is well-documented and its configuration fits the intended use.


115-119: Environment Variable Declaration

Clear and concise; the environment variable’s definition and description meet the requirements.


121-125: Stage Variable Declaration

The stage variable is straightforward with a clear description, which helps with clarity.


127-135: Name Variable Declaration

The "name" variable includes an extended description that clarifies its purpose well. This ensures users understand how it is used.


137-144: Delimiter Variable Declaration

The configuration of the delimiter variable is clear. Its description appropriately explains its behavior.


146-155: Attributes Variable Declaration

The "attributes" variable is defined as a list of strings with a clear purpose and nicely formatted multi-line description. Looks good!


157-170: Labels as Tags Variable Declaration

This block declares the "labels_as_tags" variable using a set with a detailed description. Note the difference in default value compared to the same key in the "context" variable block. Consider verifying that this distinction—["default"] vs. ["unset"]—is intentional.


172-179: Tags Variable Declaration

The "tags" variable is simply declared with an empty map as default and a concise description. Everything is in order.


181-189: Additional Tag Map Variable Declaration

The "additional_tag_map" is clearly defined with a detailed explanation. This will help users understand its rare-case usage.


191-199: Label Order Variable Declaration

The variable "label_order" is well-documented, outlining the allowed labels and their order. The description is helpful and clear.


201-209: Regex Replace Chars Variable Declaration

The "regex_replace_chars" variable is defined clearly, and the helpful description explains its purpose and the fallback behavior.


211-224: ID Length Limit Variable with Validation

This variable includes a useful validation block that ensures the id_length_limit is appropriately set. The error message is clear and informative.


226-240: Label Key Case Variable with Validation

The validation logic here correctly restricts the possible values to "lower," "title," or "upper". The error message is precise, aiding in troubleshooting.


242-258: Label Value Case Variable with Validation

Similar to label_key_case, the "label_value_case" variable has a clear validation condition and error message, ensuring that only allowed values are used.


260-277: Descriptor Formats Variable Declaration

The "descriptor_formats" variable is declared with a flexible type to allow future enhancements. The multi-line description offers clarity for users on its intended use.


279-280: File Closure and Footer Comments

The footer comment marking the end of the copied configuration from cloudposse/terraform-null-label is a useful indicator for maintainers. It neatly concludes the file.

tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/remote-state.tf (1)

1-14: Clear and Concise Module Definition

The new module "vpc_flow_logs_bucket" is defined clearly. The use of the count parameter based on var.vpc_flow_logs_enabled cleanly ensures that the module is only created when needed. The fallback logic using try(coalesce(...)) for the tenant parameter is acceptable, though you might consider adding a brief inline comment to explain the fallback order for future maintainers.

tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/vpc-flow-logs.tf (1)

1-11: Well-Structured AWS Flow Log Resource

The aws_flow_log resource is defined in a clear and straightforward manner. Using local.vpc_flow_logs_enabled to conditionally create the resource and referencing the flow logs bucket ARN via module.vpc_flow_logs_bucket[0].outputs.vpc_flow_logs_bucket_arn is a common pattern. Just ensure that the indexing logic remains safe even when the module is not created (i.e. when count is 0).

tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/providers.tf (1)

1-14: Solid AWS Provider and Role Assumption Configuration

The provider "aws" block leverages a dynamic assume_role block nicely with a compact() call to conditionally assume a role only if module.iam_roles.terraform_role_arn is defined. This pattern is neat and helps maintain clarity regarding role usage.

tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/outputs.tf (5)

1-33: Comprehensive Output Definitions for Subnets

The outputs exposing public and private subnet IDs and CIDRs, as well as the combined subnets map, are well structured and include clear descriptive text. This level of detail will help users understand the resulting infrastructure.


35-44: Detailed VPC Access Information

The outputs for network ACLs, security groups, and VPC identifiers are clear. They enhance visibility into the VPC components created by the module.


65-85: Route Tables and Subnet Routing Outputs

Outputs for private/public route table IDs and the combined route tables map are defined in a clear and consistent manner.


87-100: NAT and Endpoint Outputs

Defining outputs for NAT gateway/instance IDs and public IPs, as well as for AWS Shield protections and VPC endpoints, provides valuable insights post-deployment. Everything looks in order.


102-131: Availability Zone and Subnet Mapping Outputs

Outputs mapping availability zones and associating them to private/public subnets enhance the transparency of the subnets' distribution. The naming is consistent and the descriptions are thorough.

tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/variables.tf (22)

1-4: Essential Region Variable

The region variable is straightforward and well-documented.


6-18: Well-Described Availability Zones

The explanation for availability_zones is very detailed and reminds users about the importance of order stability—a good practice for predictable deployments.


20-29: Clear AZ IDs Variable

The variable for availability_zone_ids is defined clearly; it offers users an alternative way to specify zones.


31-38: Primary CIDR Block Configuration

Both methods for defining the primary IPv4 CIDR block (directly or via IPAM association) are covered well. The documentation makes the conflict expectations clear.


40-51: Object Definition for IPAM Association

The object structure for ipv4_primary_cidr_block_association is precise and well-commented.


53-65: Additional CIDR Block Associations Defined Thoroughly

The map object for additional CIDR associations is clear in its purpose and usage.


67-74: Timeouts for CIDR Associations

Timeout settings are defined clearly, which will aid in troubleshooting resource creation or deletion delays.


76-90: Robust IPv4 CIDRs Block with Validation

Defining ipv4_cidrs as a list of objects and restricting the list to one item via validation is a neat safeguard. This ensures predictable input.


92-96: IPv6 CIDR Block Toggle

The boolean flag for assigning an AWS-generated IPv6 CIDR block is clear.


98-105: Public Subnets Toggle

The public_subnets_enabled variable is well explained with its implications clearly stated.


107-117: NAT Gateways and Instances Configuration

The variables for NAT gateway and instance enablement, along with instance type, are set up correctly.


119-123: Configuring Instance Public IP Assignment

map_public_ip_on_launch is straightforward and its description is adequate.


125-129: Subnet Type Tag Key Requirement

The variable for subnet_type_tag_key is clearly required without a default, ensuring that users provide the needed tag.


136-140: Control Maximum Subnet Count

The max_subnet_count variable is clear in its purpose. Its description lays out the deployment strategy expected when left at default or explicitly set.


142-146: Enabling VPC Flow Logs

The vpc_flow_logs_enabled variable is clear and follows the overall consistency of the configuration.


154-158: Destination Type for Flow Logs

The vpc_flow_logs_log_destination_type is clear and set to a sensible default ("s3").


160-164: Flow Logs Bucket Environment Name

This variable is defined as a string with an empty default, which is acceptable if the environment is meant to be provided explicitly.


166-170: Flow Logs Bucket Stage Name

Similarly, vpc_flow_logs_bucket_stage_name is clearly defined and documented.


172-180: Optional Tenant Name for Flow Logs Bucket

The vpc_flow_logs_bucket_tenant_name variable is well-documented, allowing for a null value when the tenant label is not used.


182-186: NAT EIP AWS Shield Protection Flag

The variable controlling AWS Shield Advanced protection for NAT EIPs is clear and straightforward.


188-192: Gateway VPC Endpoints Configuration

The gateway_vpc_endpoints variable is defined as a set with a clear description. Good to go.


194-198: Interface VPC Endpoints Setup

The interface_vpc_endpoints variable is similarly set up clearly.

tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/main.tf (13)

1-7: Initialization and Flag Definitions:
The locals block is initialized clearly with key flags. Using “local.enabled” to gate the NAT EIP Shield and VPC Flow Logs flags is consistent.


16-22: Availability Zones Formatting:
This segment conditionally verifies and reformats the availability zones based on whether the first element’s substring equals the region. The logic is solid, but please double-check that this transformation always meets your use cases.


24-32: Determining short_region and zone IDs:
The “short_region” extraction and the corresponding formatting for “availability_zone_ids” mirror the earlier logic for availability zones. Ensure that the source mapping in module “utils.region_az_alt_code_maps” exists and returns expected results.


46-50: Gateway Endpoint Map Construction:
The use of a for-expression to construct the “gateway_endpoint_map” is neat and easy to follow. Ensure that module “subnets.private_route_table_ids” is reliably populated as expected.


52-65: Interface Endpoint Configuration:
This block documents the logic for assigning security groups to endpoint interfaces depending on whether a single or multiple groups are used. The inline comment explains the rationale well. Confirm that the key “VPC Endpoint interfaces” is consistently used across modules for accurate mapping.


68-71: Module "utils" Declaration:
The declaration using source "cloudposse/utils/aws" at version "1.3.0" is appropriate and clear.


73-91: Module "vpc" Configuration:
The VPC module is configured with the primary CIDR block(s) and associated timeouts. All necessary parameters such as DNS support and context propagation are present.


93-125: Module "endpoint_security_groups":
The use of for_each with a conditional based on the length of interface VPC endpoints is clever. The rules_map configuration is clear; just ensure that “try(length(var.interface_vpc_endpoints), 0)” behaves as expected if the variable is unset.


127-138: Module "vpc_endpoints":
The vpc_endpoints module correctly aggregates gateway and interface endpoints. The enabled condition is logical.


140-161: Module "subnets":
The subnets module configuration passes along all required variables, including CIDR blocks and tagging. The structure is clear and modular.


163-165: AWS Caller Identity Data Source:
Using a conditional “count” to conditionally fetch the AWS caller identity if NAT EIP Shield protection is enabled is a sound approach.


167-171: AWS EIP Data Source:
This for_each construct for fetching EIP details when protection is enabled is well-formed. Ensure that “module.subnets.nat_ips” returns a set of public IPs as expected.


173-178: AWS Shield Protection Resource:
The resource block correctly creates AWS Shield protections for NAT EIPs by dynamically generating the ARN. Verify that “data.aws_caller_identity.current” is non-empty when protection is enabled to avoid index issues.

tests/fixtures/scenarios/vendor/components/terraform/infra/my-vpc1/README.md (4)

1-3: Component Introduction:
The README’s title and introductory description clearly state the component’s purpose. This sets a good context for users.


5-9: Usage Overview and Stack Level Declaration:
The “Usage” section is concise and correctly indicates that the stack operates at a regional level. The instructions are clear.


11-38: Usage Example Snippet:
The YAML snippet illustrating component usage is well formatted and provides practical examples for setting variables (e.g., enabling NAT gateways and VPC flow logs). Ensure that variable names such as “nat_gateway_enabled” and “max_subnet_count” align with what is defined in the Terraform configuration.


40-54: Import and Component Inheritance Example:
The secondary YAML snippet shows how to import and inherit defaults from a catalog, which is useful for users. The structure is straightforward and instructive.

coderabbitai[bot]
coderabbitai bot previously approved these changes Feb 9, 2025
* updates

* updates

* updates

* updates

* updates

* updates

* Update internal/exec/terraform_outputs.go

Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <erik@cloudposse.com>

* Update internal/exec/terraform_outputs.go

Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <erik@cloudposse.com>

* Update internal/exec/terraform_outputs.go

Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <erik@cloudposse.com>

* Update internal/exec/terraform_outputs.go

Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <erik@cloudposse.com>

* Update internal/exec/terraform_outputs.go

Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <erik@cloudposse.com>

* Update internal/exec/terraform_outputs.go

Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <erik@cloudposse.com>

* Update internal/exec/terraform_outputs.go

Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <erik@cloudposse.com>

* Update internal/exec/terraform_outputs.go

Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <erik@cloudposse.com>

* updates

* updates

* updates

* updates

* updates

* updates

* updates

* updates

* updates

* updates

* updates

* updates

* updates

---------

Co-authored-by: Erik Osterman (CEO @ Cloud Posse) <erik@cloudposse.com>
Copy link
Contributor
@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🔭 Outside diff range comments (1)
pkg/utils/map_utils.go (1)

45-55: Add error handling for non-string keys and nil input.

The function silently skips non-string keys, which could lead to unexpected data loss. Consider these improvements:

-// MapOfInterfaceKeysToMapOfStringKeys converts map[any]any to map[string]any
+// MapOfInterfaceKeysToMapOfStringKeys converts map[any]any to map[string]any.
+// It returns an error if any key cannot be converted to string.
+// Returns empty map for nil input.
-func MapOfInterfaceKeysToMapOfStringKeys(input map[any]any) map[string]any {
+func MapOfInterfaceKeysToMapOfStringKeys(input map[any]any) (map[string]any, error) {
+    if input == nil {
+        return make(map[string]any), nil
+    }
     converted := make(map[string]any, len(input))
     for key, value := range input {
         strKey, ok := key.(string)
-        if ok {
-            converted[strKey] = value
+        if !ok {
+            return nil, fmt.Errorf("key %v cannot be converted to string", key)
         }
+        converted[strKey] = value
     }
-    return converted
+    return converted, nil
 }
🧹 Nitpick comments (2)
pkg/utils/map_utils.go (1)

38-43: Consider adding nil check and examples.

The implementation is clean and efficient! A few suggestions to make it even more robust:

 // MapOfInterfacesToMapOfStrings converts map[string]any to map[string]string
+//
+// Example:
+//   input := map[string]any{"count": 42, "name": "test"}
+//   result := MapOfInterfacesToMapOfStrings(input)
+//   // result = map[string]string{"count": "42", "name": "test"}
 func MapOfInterfacesToMapOfStrings(input map[string]any) map[string]string {
+    if input == nil {
+        return make(map[string]string)
+    }
     return lo.MapEntries(input, func(key string, value any) (string, string) {
         return key, fmt.Sprintf("%v", value)
     })
 }
internal/exec/terraform_utils.go (1)

46-59: Consider adding error handling for path conversion.

While the path handling is good, consider adding error handling for the filepath.Join operation when converting relative paths to absolute.

 if !filepath.IsAbs(tfDataDir) {
-    tfDataDir = filepath.Join(componentPath, tfDataDir)
+    absPath, err := filepath.Abs(filepath.Join(componentPath, tfDataDir))
+    if err != nil {
+        l.Debug("Failed to convert path to absolute", "path", tfDataDir, "error", err)
+        // Fall back to the joined path
+        tfDataDir = filepath.Join(componentPath, tfDataDir)
+    } else {
+        tfDataDir = absPath
+    }
 }
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1df19ab and 9e98d6d.

⛔ Files ignored due to path filters (1)
  • go.sum is excluded by !**/*.sum
📒 Files selected for processing (9)
  • examples/quick-start-advanced/Dockerfile (1 hunks)
  • go.mod (1 hunks)
  • internal/exec/spinner_utils.go (2 hunks)
  • internal/exec/terraform_outputs.go (10 hunks)
  • internal/exec/terraform_utils.go (4 hunks)
  • internal/exec/validate_stacks.go (1 hunks)
  • pkg/utils/map_utils.go (2 hunks)
  • tests/fixtures/scenarios/complete/stacks/catalog/terraform/template-functions-test/defaults.yaml (1 hunks)
  • tests/test-cases/atmos-functions.yaml (3 hunks)
✅ Files skipped from review due to trivial changes (1)
  • go.mod
🚧 Files skipped from review as they are similar to previous changes (1)
  • tests/test-cases/atmos-functions.yaml
🧰 Additional context used
🧠 Learnings (2)
internal/exec/terraform_utils.go (1)
Learnt from: aknysh
PR: cloudposse/atmos#759
File: internal/exec/terraform.go:366-368
Timestamp: 2024-11-12T05:52:05.088Z
Learning: In `internal/exec/terraform.go`, the workspace cleaning code under both the general execution path and within the `case "init":` block is intentionally duplicated because the code execution paths are different. The `.terraform/environment` file should be deleted before executing `terraform init` in both scenarios to ensure a clean state.
internal/exec/terraform_outputs.go (1)
Learnt from: aknysh
PR: cloudposse/atmos#810
File: internal/exec/terraform_utils.go:40-213
Timestamp: 2024-12-03T05:18:49.169Z
Learning: In the context of the Atmos project, it's acceptable for functions like `execTerraformOutput` to remain as single functions if they perform a single purpose, such as retrieving Terraform outputs for a component in a stack, even if the function is lengthy.
⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: Build (windows-latest, windows)
  • GitHub Check: Summary
🔇 Additional comments (10)
tests/fixtures/scenarios/complete/stacks/catalog/terraform/template-functions-test/defaults.yaml (1)

35-37: Added Environment Variables Enhance Test Configuration
The new env section with TEST1 set to a and TEST2 set to b is correctly integrated into the configuration. This addition improves consistency with other test cases that utilize environment variables, supporting better configuration management and test isolation.

examples/quick-start-advanced/Dockerfile (1)

2-2: Update GEODESIC Version

The GEODESIC_VERSION argument is now set to 4.0.1, ensuring the Docker build uses the latest Geodesic release. This update aligns with our objective of leveraging the latest features and improvements, and it should help support enhanced logging and version check functionalities elsewhere in the codebase.

pkg/utils/map_utils.go (1)

4-4: LGTM! Import addition is well-placed.

The fmt package import is necessary for string formatting in the new functions.

internal/exec/spinner_utils.go (3)

44-63: LGTM! Well-structured spinner initialization with TTY support.

The function properly handles TTY detection and gracefully falls back to basic output when no terminal is attached.


65-75: LGTM! Safe goroutine management with proper cleanup.

The function correctly defers channel closure and handles spinner execution errors.


77-81: LGTM! Clean spinner termination with synchronization.

The function ensures proper cleanup by waiting for the spinner goroutine to complete.

internal/exec/terraform_utils.go (1)

29- DE95 59: LGTM! Robust environment variable and path handling.

The code properly handles the TF_DATA_DIR environment variable with a sensible default and ensures paths are absolute and clean.

internal/exec/terraform_outputs.go (2)

128-140: LGTM! Proper environment variable handling from env section.

The code correctly sets environment variables from the env section with appropriate type conversion and error handling.


241-249: LGTM! Clean spinner integration with proper resource management.

The spinner initialization and cleanup is handled correctly with proper channel management.

internal/exec/validate_stacks.go (1)

31-37: LGTM! Clean spinner integration with proper resource management.

The code correctly initializes, runs, and cleans up the spinner using the new utilities.

@osterman
Copy link
Member

@Cerebrovinny this PR is too messed up to continue

@osterman osterman closed this Feb 11, 2025
@mergify mergify bot removed the needs-cloudposse Needs Cloud Posse assistance label Feb 11, 2025
@osterman osterman deleted the logs-improvements-part2 branch February 27, 2025 17:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
minor New features that do not break anything
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants
0