aws-cloudformation / cfn-lint

CloudFormation Linter
MIT No Attribution
2.43k stars 588 forks source link

junit dependency missing #3397

Closed rbpltr closed 3 months ago

rbpltr commented 3 months ago

CloudFormation Lint Version

cfn-lint 1.3.4 (Homebrew)

What operating system are you using?

macOS 14.5

Describe the bug

$ cfn-lint -t template.yml -f junit
Traceback (most recent call last):
  File "/opt/homebrew/Cellar/cfn-lint/1.3.4/libexec/lib/python3.12/site-packages/cfnlint/formatters/junit.py", line 23, in print_matches
    from junit_xml import TestCase, TestSuite, to_xml_report_string
ModuleNotFoundError: No module named 'junit_xml'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/opt/homebrew/bin/cfn-lint", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/opt/homebrew/Cellar/cfn-lint/1.3.4/libexec/lib/python3.12/site-packages/cfnlint/runner.py", line 429, in main
    runner.cli()
  File "/opt/homebrew/Cellar/cfn-lint/1.3.4/libexec/lib/python3.12/site-packages/cfnlint/runner.py", line 423, in cli
    self._cli_output(list(self.run()))
  File "/opt/homebrew/Cellar/cfn-lint/1.3.4/libexec/lib/python3.12/site-packages/cfnlint/runner.py", line 315, in _cli_output
    output = formatter.print_matches(matches, self.rules, config=self.config)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/cfn-lint/1.3.4/libexec/lib/python3.12/site-packages/cfnlint/formatters/junit.py", line 25, in print_matches
    raise ImportError("Missing optional dependencies junit") from e
ImportError: Missing optional dependencies junit

Expected behavior

junit-formatted output is produced

Reproduction template

Issue not specific to template

kddejong commented 3 months ago

Starting in v1 junit is an optional dependency.

You can install it using pip install cfn-lint[junit]

rbpltr commented 3 months ago

That produces error:

$ pip install cfn-lint[junit]
bash: pip: command not found

$ pip3 install cfn-lint[junit]
error: externally-managed-environment

Ɨ This environment is externally managed
ā•°ā”€> To install Python packages system-wide, try brew install
    xyz, where xyz is the package you are trying to
    install.

    If you wish to install a Python library that isn't in Homebrew,
    use a virtual environment:

    python3 -m venv path/to/venv
    source path/to/venv/bin/activate
    python3 -m pip install xyz

    If you wish to install a Python application that isn't in Homebrew,
    it may be easiest to use 'pipx install xyz', which will manage a
    virtual environment for you. You can install pipx with

    brew install pipx

    You may restore the old behavior of pip by passing
    the '--break-system-packages' flag to pip, or by adding
    'break-system-packages = true' to your pip.conf file. The latter
    will permanently disable this error.

    If you disable this error, we STRONGLY recommend that you additionally
    pass the '--user' flag to pip, or set 'user = true' in your pip.conf
    file. Failure to do this can result in a broken Homebrew installation.

    Read more about this behavior here: <https://peps.python.org/pep-0668/>

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
rbpltr commented 3 months ago

I had to use the Python binary within the Homebrew package to install this:

/opt/homebrew/Cellar/cfn-lint/1.3.4/libexec/bin/python -m pip install cfn-lint[junit]

A more generic version for the benefit of other people:

"$(brew --cellar cfn-lint)/$(cfn-lint --version | cut -d' ' -f2)/libexec/bin/python" -m pip install cfn-lint[junit]

I'm doubtful that this will persist through Homebrew upgrading the cfn-lint package. Not ideal šŸ˜•

rbpltr commented 3 months ago

Confirmed that the optional dependency is not persisted through upgrade of Homebrew cfn-lint package.