lintro 0.6.2__py3-none-any.whl → 0.17.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. lintro/__init__.py +1 -1
  2. lintro/cli.py +230 -14
  3. lintro/cli_utils/commands/__init__.py +8 -1
  4. lintro/cli_utils/commands/check.py +1 -0
  5. lintro/cli_utils/commands/config.py +325 -0
  6. lintro/cli_utils/commands/format.py +2 -2
  7. lintro/cli_utils/commands/init.py +361 -0
  8. lintro/cli_utils/commands/list_tools.py +180 -42
  9. lintro/cli_utils/commands/test.py +316 -0
  10. lintro/cli_utils/commands/versions.py +81 -0
  11. lintro/config/__init__.py +62 -0
  12. lintro/config/config_loader.py +420 -0
  13. lintro/config/lintro_config.py +189 -0
  14. lintro/config/tool_config_generator.py +403 -0
  15. lintro/enums/__init__.py +1 -0
  16. lintro/enums/darglint_strictness.py +10 -0
  17. lintro/enums/hadolint_enums.py +22 -0
  18. lintro/enums/tool_name.py +2 -0
  19. lintro/enums/tool_type.py +2 -0
  20. lintro/enums/yamllint_format.py +11 -0
  21. lintro/exceptions/__init__.py +1 -0
  22. lintro/formatters/__init__.py +1 -0
  23. lintro/formatters/core/__init__.py +1 -0
  24. lintro/formatters/core/output_style.py +11 -0
  25. lintro/formatters/core/table_descriptor.py +8 -0
  26. lintro/formatters/styles/csv.py +2 -0
  27. lintro/formatters/styles/grid.py +2 -0
  28. lintro/formatters/styles/html.py +2 -0
  29. lintro/formatters/styles/json.py +2 -0
  30. lintro/formatters/styles/markdown.py +2 -0
  31. lintro/formatters/styles/plain.py +2 -0
  32. lintro/formatters/tools/__init__.py +12 -0
  33. lintro/formatters/tools/black_formatter.py +27 -5
  34. lintro/formatters/tools/darglint_formatter.py +16 -1
  35. lintro/formatters/tools/eslint_formatter.py +108 -0
  36. lintro/formatters/tools/hadolint_formatter.py +13 -0
  37. lintro/formatters/tools/markdownlint_formatter.py +88 -0
  38. lintro/formatters/tools/prettier_formatter.py +15 -0
  39. lintro/formatters/tools/pytest_formatter.py +201 -0
  40. lintro/formatters/tools/ruff_formatter.py +26 -5
  41. lintro/formatters/tools/yamllint_formatter.py +14 -1
  42. lintro/models/__init__.py +1 -0
  43. lintro/models/core/__init__.py +1 -0
  44. lintro/models/core/tool_config.py +11 -7
  45. lintro/parsers/__init__.py +69 -9
  46. lintro/parsers/actionlint/actionlint_parser.py +1 -1
  47. lintro/parsers/bandit/__init__.py +6 -0
  48. lintro/parsers/bandit/bandit_issue.py +49 -0
  49. lintro/parsers/bandit/bandit_parser.py +99 -0
  50. lintro/parsers/black/black_issue.py +4 -0
  51. lintro/parsers/darglint/__init__.py +1 -0
  52. lintro/parsers/darglint/darglint_issue.py +11 -0
  53. lintro/parsers/eslint/__init__.py +6 -0
  54. lintro/parsers/eslint/eslint_issue.py +26 -0
  55. lintro/parsers/eslint/eslint_parser.py +63 -0
  56. lintro/parsers/markdownlint/__init__.py +6 -0
  57. lintro/parsers/markdownlint/markdownlint_issue.py +22 -0
  58. lintro/parsers/markdownlint/markdownlint_parser.py +113 -0
  59. lintro/parsers/prettier/__init__.py +1 -0
  60. lintro/parsers/prettier/prettier_issue.py +12 -0
  61. lintro/parsers/prettier/prettier_parser.py +1 -1
  62. lintro/parsers/pytest/__init__.py +21 -0
  63. lintro/parsers/pytest/pytest_issue.py +28 -0
  64. lintro/parsers/pytest/pytest_parser.py +483 -0
  65. lintro/parsers/ruff/ruff_parser.py +6 -2
  66. lintro/parsers/yamllint/__init__.py +1 -0
  67. lintro/tools/__init__.py +3 -1
  68. lintro/tools/core/__init__.py +1 -0
  69. lintro/tools/core/timeout_utils.py +112 -0
  70. lintro/tools/core/tool_base.py +286 -50
  71. lintro/tools/core/tool_manager.py +77 -24
  72. lintro/tools/core/version_requirements.py +482 -0
  73. lintro/tools/implementations/__init__.py +1 -0
  74. lintro/tools/implementations/pytest/pytest_command_builder.py +311 -0
  75. lintro/tools/implementations/pytest/pytest_config.py +200 -0
  76. lintro/tools/implementations/pytest/pytest_error_handler.py +128 -0
  77. lintro/tools/implementations/pytest/pytest_executor.py +122 -0
  78. lintro/tools/implementations/pytest/pytest_handlers.py +375 -0
  79. lintro/tools/implementations/pytest/pytest_option_validators.py +212 -0
  80. lintro/tools/implementations/pytest/pytest_output_processor.py +408 -0
  81. lintro/tools/implementations/pytest/pytest_result_processor.py +113 -0
  82. lintro/tools/implementations/pytest/pytest_utils.py +697 -0
  83. lintro/tools/implementations/tool_actionlint.py +106 -16
  84. lintro/tools/implementations/tool_bandit.py +34 -29
  85. lintro/tools/implementations/tool_black.py +236 -29
  86. lintro/tools/implementations/tool_darglint.py +183 -22
  87. lintro/tools/implementations/tool_eslint.py +374 -0
  88. lintro/tools/implementations/tool_hadolint.py +94 -25
  89. lintro/tools/implementations/tool_markdownlint.py +354 -0
  90. lintro/tools/implementations/tool_prettier.py +317 -24
  91. lintro/tools/implementations/tool_pytest.py +327 -0
  92. lintro/tools/implementations/tool_ruff.py +278 -84
  93. lintro/tools/implementations/tool_yamllint.py +448 -34
  94. lintro/tools/tool_enum.py +8 -0
  95. lintro/utils/__init__.py +1 -0
  96. lintro/utils/ascii_normalize_cli.py +5 -0
  97. lintro/utils/config.py +41 -18
  98. lintro/utils/console_logger.py +211 -25
  99. lintro/utils/path_utils.py +42 -0
  100. lintro/utils/tool_executor.py +339 -45
  101. lintro/utils/tool_utils.py +51 -24
  102. lintro/utils/unified_config.py +926 -0
  103. {lintro-0.6.2.dist-info → lintro-0.17.2.dist-info}/METADATA +172 -30
  104. lintro-0.17.2.dist-info/RECORD +134 -0
  105. lintro-0.6.2.dist-info/RECORD +0 -96
  106. {lintro-0.6.2.dist-info → lintro-0.17.2.dist-info}/WHEEL +0 -0
  107. {lintro-0.6.2.dist-info → lintro-0.17.2.dist-info}/entry_points.txt +0 -0
  108. {lintro-0.6.2.dist-info → lintro-0.17.2.dist-info}/licenses/LICENSE +0 -0
  109. {lintro-0.6.2.dist-info → lintro-0.17.2.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lintro
3
- Version: 0.6.2
3
+ Version: 0.17.2
4
4
  Summary: A unified CLI tool for code formatting, linting, and quality assurance
5
5
  Author-email: TurboCoder13 <turbocoder13@gmail.com>
6
6
  License: MIT License
@@ -36,7 +36,7 @@ Classifier: Programming Language :: Python :: 3.13
36
36
  Classifier: Topic :: Software Development :: Quality Assurance
37
37
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
38
38
  Classifier: Topic :: Utilities
39
- Requires-Python: ==3.13.7
39
+ Requires-Python: >=3.13
40
40
  Description-Content-Type: text/markdown
41
41
  License-File: LICENSE
42
42
  Requires-Dist: click==8.1.8
@@ -48,23 +48,27 @@ Requires-Dist: yamllint==1.37.1
48
48
  Requires-Dist: httpx==0.28.1
49
49
  Requires-Dist: toml==0.10.2
50
50
  Requires-Dist: defusedxml==0.7.1
51
+ Requires-Dist: ruff>=0.14.0
52
+ Requires-Dist: black>=25.0.0
53
+ Requires-Dist: bandit>=1.8.0
51
54
  Provides-Extra: dev
52
- Requires-Dist: pytest==8.4.2; extra == "dev"
53
- Requires-Dist: pytest-cov==6.3.0; extra == "dev"
54
- Requires-Dist: pytest-mock==3.15.0; extra == "dev"
55
+ Requires-Dist: pytest==9.0.1; extra == "dev"
56
+ Requires-Dist: pytest-cov==7.0.0; extra == "dev"
57
+ Requires-Dist: pytest-mock==3.15.1; extra == "dev"
55
58
  Requires-Dist: pytest-xdist==3.8.0; extra == "dev"
56
- Requires-Dist: tox==4.30.1; extra == "dev"
57
- Requires-Dist: allure-pytest==2.15.0; extra == "dev"
59
+ Requires-Dist: pytest-sugar==1.1.1; extra == "dev"
60
+ Requires-Dist: tox==4.32.0; extra == "dev"
61
+ Requires-Dist: allure-pytest==2.15.2; extra == "dev"
58
62
  Requires-Dist: ruff; extra == "dev"
59
63
  Requires-Dist: mypy; extra == "dev"
60
64
  Requires-Dist: coverage-badge==1.1.2; extra == "dev"
61
- Requires-Dist: python-semantic-release==10.3.2; extra == "dev"
65
+ Requires-Dist: python-semantic-release==10.5.2; extra == "dev"
62
66
  Requires-Dist: assertpy==1.1; extra == "dev"
63
67
  Requires-Dist: httpx==0.28.1; extra == "dev"
64
68
  Provides-Extra: test
65
- Requires-Dist: pytest==8.4.2; extra == "test"
66
- Requires-Dist: pytest-cov==6.3.0; extra == "test"
67
- Requires-Dist: pytest-mock==3.15.0; extra == "test"
69
+ Requires-Dist: pytest==9.0.1; extra == "test"
70
+ Requires-Dist: pytest-cov==7.0.0; extra == "test"
71
+ Requires-Dist: pytest-mock==3.15.1; extra == "test"
68
72
  Requires-Dist: pytest-xdist==3.8.0; extra == "test"
69
73
  Requires-Dist: assertpy==1.1; extra == "test"
70
74
  Provides-Extra: typing
@@ -74,13 +78,19 @@ Dynamic: license-file
74
78
 
75
79
  # Lintro
76
80
 
81
+ <!-- markdownlint-disable MD033 MD013 -->
77
82
  <img src="https://raw.githubusercontent.com/TurboCoder13/py-lintro/main/assets/images/lintro.png" alt="Lintro Logo" style="width:100%;max-width:800px;height:auto;display:block;margin:0 auto 24px auto;">
83
+ <!-- markdownlint-enable MD033 MD013 -->
78
84
 
79
- A comprehensive CLI tool that unifies various code formatting, linting, and quality assurance tools under a single command-line interface.
85
+ A comprehensive CLI tool that unifies various code formatting, linting, and quality
86
+ assurance tools under a single command-line interface.
80
87
 
81
88
  ## What is Lintro?
82
89
 
83
- Lintro is a unified command-line interface that brings together multiple code quality tools into a single, easy-to-use package. Instead of managing separate tools like Ruff, Prettier, Yamllint, and others individually, Lintro provides a consistent interface for all your code quality needs.
90
+ Lintro is a unified command-line interface that brings together multiple code quality
91
+ tools into a single, easy-to-use package. Instead of managing separate tools like Ruff,
92
+ Prettier, Yamllint, and others individually, Lintro provides a consistent interface for
93
+ all your code quality needs.
84
94
 
85
95
  [![Python](https://img.shields.io/badge/python-3.13-blue)](https://www.python.org/downloads/)
86
96
  [![Coverage](https://codecov.io/gh/TurboCoder13/py-lintro/branch/main/graph/badge.svg)](https://codecov.io/gh/TurboCoder13/py-lintro)
@@ -88,10 +98,18 @@ Lintro is a unified command-line interface that brings together multiple code qu
88
98
  [![Tests](https://img.shields.io/github/actions/workflow/status/TurboCoder13/py-lintro/test-and-coverage.yml?label=tests&branch=main&logo=githubactions&logoColor=white)](https://github.com/TurboCoder13/py-lintro/actions/workflows/test-and-coverage.yml?query=branch%3Amain)
89
99
  [![CI](https://img.shields.io/github/actions/workflow/status/TurboCoder13/py-lintro/ci-lintro-analysis.yml?label=ci&branch=main&logo=githubactions&logoColor=white)](https://github.com/TurboCoder13/py-lintro/actions/workflows/ci-lintro-analysis.yml?query=branch%3Amain)
90
100
  [![Docker](https://img.shields.io/github/actions/workflow/status/TurboCoder13/py-lintro/docker-build-publish.yml?label=docker&logo=docker&branch=main)](https://github.com/TurboCoder13/py-lintro/actions/workflows/docker-build-publish.yml?query=branch%3Amain)
101
+ [![SBOM (main)](<https://img.shields.io/github/actions/workflow/status/TurboCoder13/py-lintro/sbom-on-main.yml?label=sbom%20(main)&branch=main>)](https://github.com/TurboCoder13/py-lintro/actions/workflows/sbom-on-main.yml?query=branch%3Amain)
102
+ [![Publish - PyPI Production](https://github.com/TurboCoder13/py-lintro/actions/workflows/publish-pypi-on-tag.yml/badge.svg)](https://github.com/TurboCoder13/py-lintro/actions/workflows/publish-pypi-on-tag.yml)
91
103
  [![PyPI](https://img.shields.io/pypi/v/lintro?label=pypi)](https://pypi.org/project/lintro/)
92
104
 
93
105
  [![CodeQL](https://github.com/TurboCoder13/py-lintro/actions/workflows/codeql.yml/badge.svg?branch=main)](https://github.com/TurboCoder13/py-lintro/actions/workflows/codeql.yml?query=branch%3Amain)
106
+
107
+ <!-- markdownlint-disable-next-line MD013 -->
108
+
94
109
  [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/TurboCoder13/py-lintro/badge)](https://scorecard.dev/viewer/?uri=github.com/TurboCoder13/py-lintro)
110
+ [![SBOM](https://img.shields.io/badge/SBOM-enabled-brightgreen)](docs/security/assurance.md)
111
+ [![Download SBOM](https://img.shields.io/badge/SBOM-download_latest-blue?logo=github)](https://github.com/TurboCoder13/py-lintro/actions/workflows/sbom-on-main.yml)
112
+ [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/11142/badge)](https://www.bestpractices.dev/projects/11142)
95
113
 
96
114
  ### Why Lintro?
97
115
 
@@ -112,18 +130,103 @@ Lintro is a unified command-line interface that brings together multiple code qu
112
130
  - **Docker support** for containerized environments
113
131
  - **CI/CD integration** with GitHub Actions
114
132
 
133
+ ## Security & Compliance
134
+
135
+ Lintro follows modern security best practices and provides comprehensive supply chain
136
+ transparency:
137
+
138
+ - **SBOM Generation**: Automated Software Bill of Materials on every push to main
139
+ - **Formats**: CycloneDX 1.6 and SPDX 2.3 (industry standards)
140
+ - **Compliance**: Meets Executive Order 14028 requirements for federal software
141
+ - **Download**:
142
+ [Latest SBOM artifacts](https://github.com/TurboCoder13/py-lintro/actions/workflows/sbom-on-main.yml)
143
+ - **Documentation**: See [Security Assurance](docs/security/assurance.md) for details
144
+
145
+ ### What's in the SBOM?
146
+
147
+ The SBOM provides a complete inventory of all dependencies:
148
+
149
+ - All Python packages with exact versions
150
+ - All npm packages (like Prettier)
151
+ - All GitHub Actions dependencies (pinned by SHA)
152
+ - Transitive dependencies
153
+ - License information
154
+
155
+ ### For Enterprise Users
156
+
157
+ Download SBOMs for security auditing and compliance:
158
+
159
+ ```bash
160
+ # Download latest SBOM artifacts
161
+ gh run download -R TurboCoder13/py-lintro \
162
+ --name sbom-artifacts \
163
+ $(gh run list -R TurboCoder13/py-lintro \
164
+ -w "Security - SBOM Generation" -L 1 \
165
+ --json databaseId -q '.[0].databaseId')
166
+
167
+ # Scan for vulnerabilities (requires grype)
168
+ grype sbom:main-*-py-lintro-sbom.spdx-2.3.json
169
+ ```
170
+
115
171
  ## Supported Tools
116
172
 
117
- | Tool | Language | Auto-fix |
118
- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | -------- |
119
- | [![Actionlint](https://img.shields.io/badge/Actionlint-GitHub%20Workflows-24292e?logo=github&logoColor=white)](https://github.com/rhysd/actionlint) | ⚙️ GitHub Workflows | - |
120
- | [![Bandit](https://img.shields.io/badge/Bandit-security-yellow?logo=python&logoColor=white)](https://github.com/PyCQA/bandit) | 🐍 Python | - |
121
- | [![Darglint](https://img.shields.io/badge/Darglint-docstrings-3776AB?logo=python&logoColor=white)](https://github.com/terrencepreilly/darglint) | 🐍 Python | - |
122
- | [![Hadolint](https://img.shields.io/badge/Hadolint-lint-2496ED?logo=docker&logoColor=white)](https://github.com/hadolint/hadolint) | 🐳 Dockerfile | - |
123
- | [![Prettier](https://img.shields.io/badge/Prettier-format-1a2b34?logo=prettier&logoColor=white)](https://prettier.io/) | 🟨 JS/TS · 🧾 JSON | |
124
- | [![Black](https://img.shields.io/badge/Black-format-000000?logo=python&logoColor=white)](https://github.com/psf/black) | 🐍 Python | |
125
- | [![Ruff](https://img.shields.io/badge/Ruff-lint%2Bformat-000?logo=ruff&logoColor=white)](https://github.com/astral-sh/ruff) | 🐍 Python | |
126
- | [![Yamllint](https://img.shields.io/badge/Yamllint-lint-cb171e?logo=yaml&logoColor=white)](https://github.com/adrienverge/yamllint) | 🧾 YAML | - |
173
+ <!-- markdownlint-disable MD013 MD060 -->
174
+
175
+ | Tool | Language | Auto-fix |
176
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------- | -------- |
177
+ | [![Actionlint](https://img.shields.io/badge/Actionlint-GitHub%20Workflows-24292e?logo=github&logoColor=white)](https://github.com/rhysd/actionlint) | ⚙️ GitHub Workflows | - |
178
+ | [![Bandit](https://img.shields.io/badge/Bandit-security-yellow?logo=python&logoColor=white)](https://github.com/PyCQA/bandit) | 🐍 Python | - |
179
+ | [![Darglint](https://img.shields.io/badge/Darglint-docstrings-3776AB?logo=python&logoColor=white)](https://github.com/terrencepreilly/darglint) | 🐍 Python | - |
180
+ | [![Hadolint](https://img.shields.io/badge/Hadolint-lint-2496ED?logo=docker&logoColor=white)](https://github.com/hadolint/hadolint) | 🐳 Dockerfile | - |
181
+ | [![Markdownlint-cli2](https://img.shields.io/badge/Markdownlint--cli2-lint-000000?logo=markdown&logoColor=white)](https://github.com/DavidAnson/markdownlint-cli2) | 📝 Markdown | - |
182
+ | [![Prettier](https://img.shields.io/badge/Prettier-format-1a2b34?logo=prettier&logoColor=white)](https://prettier.io/) | 🟨 JS/TS · 🧾 JSON | |
183
+ | [![Black](https://img.shields.io/badge/Black-format-000000?logo=python&logoColor=white)](https://github.com/psf/black) | 🐍 Python | ✅ |
184
+ | [![Ruff](https://img.shields.io/badge/Ruff-lint%2Bformat-000?logo=ruff&logoColor=white)](https://github.com/astral-sh/ruff) | 🐍 Python | ✅ |
185
+ | [![Yamllint](https://img.shields.io/badge/Yamllint-lint-cb171e?logo=yaml&logoColor=white)](https://github.com/adrienverge/yamllint) | 🧾 YAML | - |
186
+
187
+ <!-- markdownlint-enable MD013 MD060 -->
188
+
189
+ ## Requirements
190
+
191
+ ### Python Version
192
+
193
+ **Python 3.13+** is required. Lintro uses modern Python features and syntax that are not
194
+ available in older versions.
195
+
196
+ ### Tool Dependencies
197
+
198
+ Lintro automatically installs and manages several Python tools to ensure consistent
199
+ behavior. These tools are bundled as dependencies with versions centrally managed in
200
+ `pyproject.toml`:
201
+
202
+ - **Ruff** - Fast Python linter and formatter
203
+ - **Black** - Python code formatter
204
+ - **Bandit** - Python security linter
205
+ - **Yamllint** - YAML linter
206
+ - **Darglint** - Python docstring linter
207
+
208
+ ### Optional External Tools
209
+
210
+ For full functionality, you may want to install additional tools with versions managed
211
+ in `pyproject.toml`:
212
+
213
+ - **Prettier** - JavaScript/TypeScript formatter (`npm install --save-dev prettier`)
214
+ - **Markdownlint-cli2** - Markdown linter (`npm install --save-dev markdownlint-cli2`)
215
+ - **Hadolint** - Dockerfile linter
216
+ ([GitHub Releases](https://github.com/hadolint/hadolint/releases))
217
+ - **Actionlint** - GitHub Actions linter
218
+ ([GitHub Releases](https://github.com/rhysd/actionlint/releases))
219
+
220
+ ### Version Verification
221
+
222
+ Check all tool versions with:
223
+
224
+ ```bash
225
+ lintro list-tools
226
+ ```
227
+
228
+ This command reads version requirements directly from `pyproject.toml` and verifies your
229
+ installed tools.
127
230
 
128
231
  ## Quick Start
129
232
 
@@ -131,8 +234,11 @@ Lintro is a unified command-line interface that brings together multiple code qu
131
234
 
132
235
  #### From PyPI (Recommended)
133
236
 
237
+ ⚠️ **Important**: Versions prior to 0.13.2 contain a circular import bug that prevents
238
+ installation as a dependency. Please use version 0.13.2 or later.
239
+
134
240
  ```bash
135
- pip install lintro
241
+ pip install lintro>=0.13.2
136
242
  ```
137
243
 
138
244
  #### Development Installation
@@ -223,8 +329,36 @@ lintro check --tool-options "ruff:line_length=88,prettier:print_width=80"
223
329
  # default to avoid double-formatting. Override if needed:
224
330
  lintro format --tool-options ruff:format=True # force Ruff to format
225
331
  lintro check --tool-options ruff:format_check=True # force Ruff format check
332
+
333
+ # Pytest examples:
334
+ lintro test --tool-options "pytest:verbose=True,tb=short,maxfail=5" # Basic options
335
+ lintro test --tool-options "pytest:workers=4" # Parallel execution
336
+ lintro test --tool-options "pytest:parallel_preset=medium" # Preset workers
337
+ lintro test --tool-options "pytest:coverage_threshold=85" # Coverage threshold
338
+ lintro test --tool-options "pytest:html_report=report.html" # HTML report
339
+ lintro test --tool-options "pytest:timeout=300" # Test timeout
340
+ lintro test --tool-options "pytest:reruns=2,reruns_delay=1" # Retry failed tests
226
341
  ```
227
342
 
343
+ #### Parallel Execution Presets
344
+
345
+ Lintro provides convenient presets for parallel test execution that automatically scale
346
+ based on your system's CPU count:
347
+
348
+ | Preset | Workers | Best For | Example |
349
+ | -------- | --------------- | ------------------------------------ | ---------------------------------------------- |
350
+ | `auto` | All CPU cores | Large CI environments | `--tool-options pytest:parallel_preset=auto` |
351
+ | `small` | 2 workers | Small test suites, local development | `--tool-options pytest:parallel_preset=small` |
352
+ | `medium` | 4 workers | Medium test suites | `--tool-options pytest:parallel_preset=medium` |
353
+ | `large` | Up to 8 workers | Large test suites | `--tool-options pytest:parallel_preset=large` |
354
+
355
+ **Best Practices:**
356
+
357
+ - Use `small` for local development to avoid overwhelming your machine
358
+ - Use `medium` for typical project test suites
359
+ - Use `large` or `auto` in CI environments with plenty of resources
360
+ - Requires `pytest-xdist` plugin to be installed
361
+
228
362
  ### CI/CD Integration
229
363
 
230
364
  Lintro includes pre-built GitHub Actions workflows:
@@ -237,13 +371,16 @@ See [GitHub Integration Guide](docs/github-integration.md) for setup instruction
237
371
 
238
372
  ## Documentation
239
373
 
240
- For comprehensive documentation, see our **[Documentation Hub](docs/README.md)** which includes:
374
+ For comprehensive documentation, see our **[Documentation Hub](docs/README.md)** which
375
+ includes:
241
376
 
242
377
  - **[Getting Started](docs/getting-started.md)** - Installation and basic usage
243
378
  - **[Docker Usage](docs/docker.md)** - Containerized development
244
379
  - **[GitHub Integration](docs/github-integration.md)** - CI/CD setup
245
380
  - **[Configuration](docs/configuration.md)** - Tool configuration options
246
381
  - **[Contributing](docs/contributing.md)** - Developer guide
382
+ - **[Pytest Integration Guide](docs/tool-analysis/pytest-analysis.md)** - Complete
383
+ pytest usage and troubleshooting
247
384
  - **[Tool Analysis](docs/tool-analysis/)** - Detailed tool comparisons
248
385
 
249
386
  ## Development
@@ -260,7 +397,8 @@ For comprehensive documentation, see our **[Documentation Hub](docs/README.md)**
260
397
  ./scripts/docker/docker-lintro.sh check --output-format grid
261
398
  ```
262
399
 
263
- For detailed information about all available scripts, see [Scripts Documentation](scripts/README.md).
400
+ For detailed information about all available scripts, see
401
+ [Scripts Documentation](scripts/README.md).
264
402
 
265
403
  ## Dependencies
266
404
 
@@ -270,7 +408,8 @@ For detailed information about all available scripts, see [Scripts Documentation
270
408
 
271
409
  ## License
272
410
 
273
- This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
411
+ This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for
412
+ details.
274
413
 
275
414
  ## Troubleshooting
276
415
 
@@ -333,13 +472,16 @@ lintro check --tools ruff,prettier
333
472
  ### Getting Help
334
473
 
335
474
  - 📖 **Documentation**: Check the [docs/](docs/) directory
336
- - 🐛 **Bug Reports**: Use the [bug report template](.github/ISSUE_TEMPLATE/bug_report.md)
475
+ - 🐛 **Bug Reports**: Use the
476
+ [bug report template](.github/ISSUE_TEMPLATE/bug_report.md)
337
477
  - 💡 **Questions**: Use the [question template](.github/ISSUE_TEMPLATE/question.md)
338
- - 🚀 **Feature Requests**: Use the [feature request template](.github/ISSUE_TEMPLATE/feature_request.md)
478
+ - 🚀 **Feature Requests**: Use the
479
+ [feature request template](.github/ISSUE_TEMPLATE/feature_request.md)
339
480
 
340
481
  ## Contributing
341
482
 
342
- We welcome contributions! See our [Contributing Guide](docs/contributing.md) for details on:
483
+ We welcome contributions! See our [Contributing Guide](docs/contributing.md) for details
484
+ on:
343
485
 
344
486
  - Adding new tools
345
487
  - Reporting bugs
@@ -0,0 +1,134 @@
1
+ lintro/__init__.py,sha256=6feupquOVvt6EUb4QMFSlotuA4RsldyiKmQsz--NTUo,111
2
+ lintro/__main__.py,sha256=McxM6wEcEeCLBHZs0F8xzT1PxVqJYkjtaPq1_-Nug-0,106
3
+ lintro/cli.py,sha256=0Xi60clzJ5Uu-LNYL_hjdpzlNu3jp0pmJTbI7UIvpCc,11151
4
+ lintro/ascii-art/fail.txt,sha256=gshKngSrz5FvJdP6g7lPygpLsLsZZh4etBU_wR7PXOw,56396
5
+ lintro/ascii-art/success.txt,sha256=xhteIXcBvl_1QcFKMIS9CkjjCY8czdf9znP9AiB8oPU,90151
6
+ lintro/cli_utils/__init__.py,sha256=F5P_fY_s-gwNZrnV1bzUOgHGb73QeZG1i-K_kfyJ8Yg,250
7
+ lintro/cli_utils/commands/__init__.py,sha256=RMzLMZzNEwh2CwuQcaFEb_ac-BDfXwzv83H-qWWG9yE,309
8
+ lintro/cli_utils/commands/check.py,sha256=ylsici9B03Ky40x61PbzgW94xQzc24kvhwwUaohbjvw,6257
9
+ lintro/cli_utils/commands/config.py,sha256=nBBk_f-F5gThd-Ivf32T5uukX_V45mP2bBb-x0YK05w,9714
10
+ lintro/cli_utils/commands/format.py,sha256=scRuwm2xUzz0AA6QECJRrX8GX1L7fZfX8FGq-7cycTo,5181
11
+ lintro/cli_utils/commands/init.py,sha256=-ZmxZ3-oVMXw8A9aUbHzt5G7arrHYR7pplFp3xi1GxU,9376
12
+ lintro/cli_utils/commands/list_tools.py,sha256=U3J7HFnF9LUI-dd1RVSUkfYeYxQVg_fwzquiixQd_10,7955
13
+ lintro/cli_utils/commands/test.py,sha256=m2GGJgyQiSaiimPrr6xlc5S16_9nSi_kMIxAGzPcZJI,9455
14
+ lintro/cli_utils/commands/versions.py,sha256=3Tn9V4md5VcGk5p0g9S3H_EJCtEBHm39ymyp9UMWh-Q,2537
15
+ lintro/config/__init__.py,sha256=21zlmaDFEZy-LCaNEtkrt5tiD-mDjbP_N8lXTc-OFKo,1676
16
+ lintro/config/config_loader.py,sha256=0DakWcw9bA2RC0LO2TDtiSf-VX8KiIQvz6N9wnq_xLE,12526
17
+ lintro/config/lintro_config.py,sha256=bssXQMREXg72SIhNtVSZCFdk6bnFHFkeliH39fHSFzw,6252
18
+ lintro/config/tool_config_generator.py,sha256=N4bRl8UNK2HlBlapvMs2W7U-tUY7RWezrnH5-zXoqYg,11167
19
+ lintro/enums/__init__.py,sha256=ZwCDematwfGNPdZJN9j-yoGE5SkkoddRhoHz3F9pLMY,61
20
+ lintro/enums/action.py,sha256=3gln8HUNpZzAyAAjQH-cOyW1nKCx9MT6S4rFDAVirdc,597
21
+ lintro/enums/darglint_strictness.py,sha256=uzAznuAsEbOAJR4bY4v4pDQOyBVRkLGr6t-B7I-zvcs,762
22
+ lintro/enums/group_by.py,sha256=Eb2rJpeTsPhCK-1xnsyogXrcH_pmNvDZ0dHRK1h4kzM,647
23
+ lintro/enums/hadolint_enums.py,sha256=L7Srle5_wEhL5yooawkwbg-u-koBGkECcZiqx2gy24Q,1705
24
+ lintro/enums/output_format.py,sha256=lw3omfjUJUdnrqFjUWVBRSBmWdrxIveS2z2JxFxYPlU,954
25
+ lintro/enums/tool_name.py,sha256=jff47QXW4GZvClP0Aw5qT4hoAi5-LKbzQbj_p3bA3jg,842
26
+ lintro/enums/tool_type.py,sha256=EW5nT42VMQIeL1IMgmI6uu9m5Gb5kfAX9sl5CnqVUsQ,897
27
+ lintro/enums/yamllint_format.py,sha256=XzN9S2lHfVz2OKJgcamlXhR6wK9dW3tSCG-s8iiyjoI,802
28
+ lintro/exceptions/__init__.py,sha256=IZclngSiIhDcihyx_-QhTZ__ISIGI1enJu7ytprcLPc,60
29
+ lintro/exceptions/errors.py,sha256=QnELwMd6yTZVMN7nKRElhxLmxo4JeKtb-HDmVNcZ72M,374
30
+ lintro/formatters/__init__.py,sha256=-G0RkbV5aTkHqGufasVYDwye8DH0t3iB_6p0Lh_05Ik,73
31
+ lintro/formatters/core/__init__.py,sha256=Rgvun_rjCoP8mKpF6x6kaneai8un_81ViDiKLAW94EQ,70
32
+ lintro/formatters/core/output_style.py,sha256=CuUp3BgL4YhVofKaXWuFtTn0QPHuQJQy1sd-7tbcBNg,795
33
+ lintro/formatters/core/table_descriptor.py,sha256=MJvFU3xDVsl7v0_HCCAtxGKom1dw1faZW_86fOk5aEQ,849
34
+ lintro/formatters/styles/__init__.py,sha256=rRGvbHhZpu09PJs0IbraFn3-yAYBxGVFv81hsnKkjiU,337
35
+ lintro/formatters/styles/csv.py,sha256=toQ-XmT-A9T2uwELQAdMPY_lzJbh_WQsmmHQXbEQ2kI,1066
36
+ lintro/formatters/styles/grid.py,sha256=54ZtwHsjitkyEjA6aoHCf3GWkMmBXp4fE3c39bjJITw,2908
37
+ lintro/formatters/styles/html.py,sha256=FVjucFJJ3tSoh9nI1NvjJYThv_oWgiBLk6iM7Z-kyoA,1556
38
+ lintro/formatters/styles/json.py,sha256=bVLyHnoUwEcCD-X8GPdIlg_J2FDhOdJRtMr6XcZC0B8,1964
39
+ lintro/formatters/styles/markdown.py,sha256=OsOjq7bNl0P4j0Pf8eu4PiCLPCoD80rK7vZE27r-LQY,1354
40
+ lintro/formatters/styles/plain.py,sha256=lRBnAFpww9Jscw1_cEehAE1W8wTXU-dSCI0auuhvAbU,1172
41
+ lintro/formatters/tools/__init__.py,sha256=pfM-hCwPuX6H3BYSEQhU8LPDMWoxd4vmmtVgeXx68jI,1653
42
+ lintro/formatters/tools/actionlint_formatter.py,sha256=GiUlD7DSW375seiPNLwdX3mOjtcn56T7z7ho4nQzEz8,2812
43
+ lintro/formatters/tools/bandit_formatter.py,sha256=WP7haIWGjIPuGZf1FQ5Ixi5DKIySHGdX-L7hZcKnFuw,3093
44
+ lintro/formatters/tools/black_formatter.py,sha256=YTe0Zc82p8cWwlq03bRaSJKOT8iHqXuGe2pR7aFhuB4,2092
45
+ lintro/formatters/tools/darglint_formatter.py,sha256=owYIP3QxtTantBwfd4w1GVfaRiaHFXSynxAntSKw7IU,2649
46
+ lintro/formatters/tools/eslint_formatter.py,sha256=0-lKkbUAftfCJyctywziYSART7ixD_zFbLL0HYsJ1cQ,3492
47
+ lintro/formatters/tools/hadolint_formatter.py,sha256=OWc2BYae31U2TdNcxXkGl0W6fTjVWkkaJV57X4l4jRw,2995
48
+ lintro/formatters/tools/markdownlint_formatter.py,sha256=CTddZRz6DUILQ7EtJpgDo9Ik8jaPMCqFek9j_qPMbDg,2931
49
+ lintro/formatters/tools/prettier_formatter.py,sha256=GYAyHppot5aG_pWF8QHz5GmWqmqgZwE6UmcUQZFesWE,2915
50
+ lintro/formatters/tools/pytest_formatter.py,sha256=D2DHzV_vo6eULx64JnBZZ0M8zWxEC1w-pgywFU5DrZM,5963
51
+ lintro/formatters/tools/ruff_formatter.py,sha256=i3jDrEQ_8bP_AhRAgaXYSp4eVCQnjapURugWFNZCmzg,4488
52
+ lintro/formatters/tools/yamllint_formatter.py,sha256=oEwkU-I4Upfc8--KAgfVAPSyYbeqkdsDXucxj3OwjIA,3093
53
+ lintro/models/__init__.py,sha256=E6tU5BnnaRWyMEf2cdiN_C3nvbRlWDfblKHrK0is7IU,73
54
+ lintro/models/core/__init__.py,sha256=mevoEG547VTotUsgyocEB72OknnGhExNWcfel7ZPLnI,54
55
+ lintro/models/core/tool.py,sha256=TWkVV_KOYziqCdq_f3Goft3PKWKByitsQ2VFiX6MVHM,2594
56
+ lintro/models/core/tool_config.py,sha256=FCfKQ_bz2yBg_FJ5xEud7TdF0PZ3fPp1Yjty02rbHR8,1004
57
+ lintro/models/core/tool_result.py,sha256=z5fexuCBt1ir0hvzojxVX-Abt6MNIT7_JvH5oyW_FlI,1319
58
+ lintro/parsers/__init__.py,sha256=WPpTaXIJYKdHJcSdAQD_ZMGLfQey9GSl3ygLbIq35Qw,1813
59
+ lintro/parsers/actionlint/__init__.py,sha256=N953d0kbJEOZE9cG4eq9BjiSErdk10GMrngV_tKjLvo,33
60
+ lintro/parsers/actionlint/actionlint_issue.py,sha256=H_BQr04KAGHpVp1qKqETcWLi3i-u6atl7ccDae-jqX8,636
61
+ lintro/parsers/actionlint/actionlint_parser.py,sha256=tvpPOi1dQrnpf7V2-3LMANH_UfDdecI4_AwDQpZOyU0,1898
62
+ lintro/parsers/bandit/__init__.py,sha256=LMXIVOoW1wnS0mXbiVY-htdkUvb1clRSfSn7X3L2SSw,206
63
+ lintro/parsers/bandit/bandit_issue.py,sha256=zdC6dLFmks_w9JjDWQ00BPSpCUUkilElby-Ut0PVLtE,1607
64
+ lintro/parsers/bandit/bandit_parser.py,sha256=d4KRH_U_4Exv-Fxq63yyx7F484yorKr2p8caDPCyKHs,3591
65
+ lintro/parsers/black/black_issue.py,sha256=V7aWAaOEN8uJQ0weuyGIkli-MRBAMH67Aa5vTXF0Igg,740
66
+ lintro/parsers/black/black_parser.py,sha256=mCbEy4aTRtxC_SKKPNK6hThGEu8C0m9EnliFW__Sa3Y,2958
67
+ lintro/parsers/darglint/__init__.py,sha256=r2ilRjf8WdHOvXIGsg4SmtYkRUR76DowWLA_n9sIOV0,55
68
+ lintro/parsers/darglint/darglint_issue.py,sha256=Gc07-PGvv4Kn4X85tnACLYB5FygNPthEe3fYodOaFoA,444
69
+ lintro/parsers/darglint/darglint_parser.py,sha256=pbIGnmHVKjf8OaxvhQbDWWXAFZEictb3FfuhoGv_I00,2046
70
+ lintro/parsers/eslint/__init__.py,sha256=pxSv4it5nCgO62BdRKfCTPA_M3sdAshON96Zq3U4eHA,231
71
+ lintro/parsers/eslint/eslint_issue.py,sha256=SD1LoxFHBfx9IIJEjHvvl8fGbuiV5rUhceev9aBA6JM,714
72
+ lintro/parsers/eslint/eslint_parser.py,sha256=_If2RNyMjY69YkEaZNICUQVgz4tcS-oMrYQ6dP6yEpE,1946
73
+ lintro/parsers/hadolint/__init__.py,sha256=vU33M_cj6fyg7aqZthz8MFUMfBIshX_Nx3DNuQmbHD4,30
74
+ lintro/parsers/hadolint/hadolint_issue.py,sha256=VlTzTPHcluFZihFL-Tkg7UuXp1fQcD03eDCH0sr1qHU,582
75
+ lintro/parsers/hadolint/hadolint_parser.py,sha256=Q7Hf6sL45s38O3C9dbBYzOpDlb0KGFj0U3Yry_ixdK8,1810
76
+ lintro/parsers/markdownlint/__init__.py,sha256=764w8V53peZqenGHvzKK3ICkpLvXc66cm53zdcbcVVY,269
77
+ lintro/parsers/markdownlint/markdownlint_issue.py,sha256=_uHpwgln7WRGK03360Lr9jCNM9th8Wh5gQWpWNzlcBA,547
78
+ lintro/parsers/markdownlint/markdownlint_parser.py,sha256=nVIX2mmHPm4dITT4bQfq7Agzgu3KUsW6YG_krDyVhHA,3867
79
+ lintro/parsers/prettier/__init__.py,sha256=jH8yEsh_X6TpwJs1V1cN1AmbDuQwQ9qWA-_dk0R9jOA,55
80
+ lintro/parsers/prettier/prettier_issue.py,sha256=DKxV9LXxAB-CxvOsbWVEAmfpXQJvd4ikHKGyMrg1Y60,569
81
+ lintro/parsers/prettier/prettier_parser.py,sha256=TDD0KRF3NMUL24Qjo4TwSOklkwZT-KmwRbTWKTJt434,2044
82
+ lintro/parsers/pytest/__init__.py,sha256=hWHHzwBDUXoJNDBieGv4hbG6KwPRbNP3a2IkPchMs-M,506
83
+ lintro/parsers/pytest/pytest_issue.py,sha256=kFk0HePh8k_Lu1RyA5cvgosRtjCiiw8CqAId-y9g3NU,756
84
+ lintro/parsers/pytest/pytest_parser.py,sha256=gr1vLloFLjL-b1ZMpBTCXJftF7e_OlVwBF2ccm01DEo,15905
85
+ lintro/parsers/ruff/__init__.py,sha256=1oT00c82qKfveRqa4FnSedAEQjQVrb9BspJEUQJn-Kk,26
86
+ lintro/parsers/ruff/ruff_issue.py,sha256=96ht6YWImOBiRTo0ATlM1PvVhgIwFiuN8810emm9nXo,1142
87
+ lintro/parsers/ruff/ruff_parser.py,sha256=DRGzpf55OnNJCTO01RSFK4GXr6Lav-_JzACdqDesuj0,4722
88
+ lintro/parsers/yamllint/__init__.py,sha256=ZZtw7Ref1EAbY-IwSz2UxJauGak6sKO10pfYsdE_sV8,55
89
+ lintro/parsers/yamllint/yamllint_issue.py,sha256=jWawdGUiTI1HADbhg8yEdZfC6yHcmk9FDzpr3PBUPBg,608
90
+ lintro/parsers/yamllint/yamllint_parser.py,sha256=ol44xhJcspnGIsEta8vVv1xi-sIbpB12CovmT94QFmQ,1947
91
+ lintro/tools/__init__.py,sha256=i3KdM02_T3Jxj-rJasNNzMwanDWz_vOgsVkwhS7n4dg,1493
92
+ lintro/tools/tool_enum.py,sha256=U0J6fK31E-dHLlDnDxKK5TB860uxlK1KRyy6y9-JO78,1214
93
+ lintro/tools/core/__init__.py,sha256=eUbc-DlpOcFaG_gKzy-veaOQAOkC5-OuItxI--p6I9c,59
94
+ lintro/tools/core/timeout_utils.py,sha256=DQcTGH0f-XPFALpVMI84BEoC6WnPihmz9cs3UapC2O8,3746
95
+ lintro/tools/core/tool_base.py,sha256=ND_oQYkPHsjO8dRKQ9OmimHEwwhluUXmQx4SpEGsws0,20604
96
+ lintro/tools/core/tool_manager.py,sha256=nVmHcvaj8xPOYuh7EmM_mhrsGLyOTtlQuPuU0MlV5Mk,7956
97
+ lintro/tools/core/version_requirements.py,sha256=veTuv-zOZoqLyNqvkQyfTHxnQr5oZb8UDOAXmbI0Sso,15478
98
+ lintro/tools/implementations/__init__.py,sha256=7DX7vWmRUVGYgrB2Rx1IbKpLWfXfVDLiOfz-UX2Crzs,64
99
+ lintro/tools/implementations/tool_actionlint.py,sha256=rEedh-T8HBN-2lG1Od-QEMWUNaWJXzVQs0NMQygpI9A,8849
100
+ lintro/tools/implementations/tool_bandit.py,sha256=h2IaRjYbJWTsNSJUdljzifTC12JLlpIbmfc00NMtNdA,16218
101
+ lintro/tools/implementations/tool_black.py,sha256=EDEBSsbf68diEfWp1OR9ujPvsAvIlIqWdyyy4c9fWXk,17954
102
+ lintro/tools/implementations/tool_darglint.py,sha256=QqdYf8XoQjO25JxIfcu9nbXNuoi5aFSEi3ssimgkfJ0,15980
103
+ lintro/tools/implementations/tool_eslint.py,sha256=hVguyDZ6KdqOdLq8d89SWZ-q8CElTDStUthKZcBLqlE,13048
104
+ lintro/tools/implementations/tool_hadolint.py,sha256=hRAzqtCBWwpx013fsGBHI7K9m-VxnHD_qMfHLv2WdFs,14769
105
+ lintro/tools/implementations/tool_markdownlint.py,sha256=mKpXhj1ynIZOkAqEMK8V06Zwkv8bAnIang3S_xQvpFw,12079
106
+ lintro/tools/implementations/tool_prettier.py,sha256=aAoACZortp0YKOfYAQasVopluCP-oPhVS6R8wMziqLw,21497
107
+ lintro/tools/implementations/tool_pytest.py,sha256=c1FpUKdJ7TYUt0zozjJivr9jkgXNHPgfgy8oFYIeuK8,12087
108
+ lintro/tools/implementations/tool_ruff.py,sha256=VgHJaUGlKdW3anUBjFfljLa6Zox4Q7J8oILgTN1P3Rs,34788
109
+ lintro/tools/implementations/tool_yamllint.py,sha256=FM5iTisipwoeKHqWWXCruqyJ8DAPurLneAVD4KrGgUk,25744
110
+ lintro/tools/implementations/pytest/pytest_command_builder.py,sha256=zcaEyIuC39WG_Gx__Vu6_Upd_fWZBpTyTSiFsRPcAvg,10577
111
+ lintro/tools/implementations/pytest/pytest_config.py,sha256=YZ66UpxKvuAZNr99B0-R2JjhxYCI1qPzJYdiMycVwOM,7715
112
+ lintro/tools/implementations/pytest/pytest_error_handler.py,sha256=C27UQl3Doas40C1xHD6d8nB7T0i4ksaCURP8NGp2tlE,4769
113
+ lintro/tools/implementations/pytest/pytest_executor.py,sha256=Tvf22RoCqMnpo4L18vV-u2zjdp1UV_2TtfCC0XTBwZc,4413
114
+ lintro/tools/implementations/pytest/pytest_handlers.py,sha256=wiIk8YxzMNvdCLcvEHYjm7B_m3h6CgzZMk2jkvHMjoc,10894
115
+ lintro/tools/implementations/pytest/pytest_option_validators.py,sha256=s703nXJ_oTiPu7qSPGyMKfZkp6xpwMpZc6ou7tMhMxo,9452
116
+ lintro/tools/implementations/pytest/pytest_output_processor.py,sha256=GjjuWhBvriiua-XichBl2HhbvEyeRPHBAQxEI9X6NBU,14599
117
+ lintro/tools/implementations/pytest/pytest_result_processor.py,sha256=gqEw5HIiEyNoQksNaYy8XNFnDJ61A4JYcP7t7dWK8pI,3658
118
+ lintro/tools/implementations/pytest/pytest_utils.py,sha256=_74hjQWLriPhrCDF5j2mz8lPGlZeJoQwkt31S_QLqjg,22529
119
+ lintro/utils/__init__.py,sha256=mUAkJXnTb91theOR_ue6FfGHtuSm3C466T_SH_KoWRE,70
120
+ lintro/utils/ascii_normalize_cli.py,sha256=Rlasrsy9FShCKGJ_9ti4VxJGP-I05vAtTmNMENbo_a4,2575
121
+ lintro/utils/config.py,sha256=8Kr7gcXAHK06gONu5-UQfr1HiuVg0eVC0unA-qlIMxk,2148
122
+ lintro/utils/console_logger.py,sha256=jfBbSw1AUiQQucRQwMiQWYW6gsDdHkIoglU1phtjsTY,41067
123
+ lintro/utils/formatting.py,sha256=khC9hYBva5xqBV1IqNcivRH9gRdvWw6u6mh2TZLTy7E,5346
124
+ lintro/utils/output_manager.py,sha256=oIE0g8LNVQcWSQOb1MbDVqGYPrOjBGuUZ4R80M1RevQ,10213
125
+ lintro/utils/path_utils.py,sha256=L-qYHcacXaQXSAkhcoZuKrSD99WaCsJcJgg8s-rEaS0,2861
126
+ lintro/utils/tool_executor.py,sha256=tLUukSJ8Qv9_wsm7bWd7Fp9JEtQUpUppOrqR5wmC_UE,38022
127
+ lintro/utils/tool_utils.py,sha256=OdNnrdJ_WesMXpsO8oICwYYmzaTDFNqMRleVH3xdivw,17105
128
+ lintro/utils/unified_config.py,sha256=JalLYnbzi0YxT8I5Syc-MIHtHQ0EwRaC4ANUcOvWbKg,30860
129
+ lintro-0.17.2.dist-info/licenses/LICENSE,sha256=CwaAnyD2psonDBBJjbqFUz00W8nQw-FGDlEGZReUV6A,1069
130
+ lintro-0.17.2.dist-info/METADATA,sha256=GikbCAcYPSm-A4lcHkomnG9wKZV9ZBvs5fXJTn0AW50,19985
131
+ lintro-0.17.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
132
+ lintro-0.17.2.dist-info/entry_points.txt,sha256=SYSk35jFyNLEHyrofSJsRv4qFN9NsT4VWSbvnTS9ov0,43
133
+ lintro-0.17.2.dist-info/top_level.txt,sha256=_D-7eyV6gNBOoIwHuf_h60wN_RWiw8GxB430Il9VKhU,7
134
+ lintro-0.17.2.dist-info/RECORD,,
@@ -1,96 +0,0 @@
1
- lintro/__init__.py,sha256=4s18wFPNEntp53m_f4flfH6imXY47HDEobqCvIW07Zg,110
2
- lintro/__main__.py,sha256=McxM6wEcEeCLBHZs0F8xzT1PxVqJYkjtaPq1_-Nug-0,106
3
- lintro/cli.py,sha256=Fy5nqdSg4id0gjGbPy82wRTK3aZMWbRdRDnwAbIv-vs,2333
4
- lintro/ascii-art/fail.txt,sha256=gshKngSrz5FvJdP6g7lPygpLsLsZZh4etBU_wR7PXOw,56396
5
- lintro/ascii-art/success.txt,sha256=xhteIXcBvl_1QcFKMIS9CkjjCY8czdf9znP9AiB8oPU,90151
6
- lintro/cli_utils/__init__.py,sha256=F5P_fY_s-gwNZrnV1bzUOgHGb73QeZG1i-K_kfyJ8Yg,250
7
- lintro/cli_utils/commands/__init__.py,sha256=GGT-uG0gQLlHAqkrwfwqfCkD6DUMP4Tq1rgDgaYe5Ng,239
8
- lintro/cli_utils/commands/check.py,sha256=YnpuiX8-kTADnwxS_mZUPf_SkmqdyqTZFJLTDf7QSQ8,6229
9
- lintro/cli_utils/commands/format.py,sha256=nEU0Hv28O0RCIp6l-pFcKSzzyLE6fajQCiUYpRyHfzU,5175
10
- lintro/cli_utils/commands/list_tools.py,sha256=Q-ZXwkkDDZ5pdLFLyxYcKMmWAPNF_vv7N4r8yRCEn3M,3495
11
- lintro/enums/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- lintro/enums/action.py,sha256=3gln8HUNpZzAyAAjQH-cOyW1nKCx9MT6S4rFDAVirdc,597
13
- lintro/enums/darglint_strictness.py,sha256=_mKMbGtqzQd8dtRkzP_QHI_3OgIPiW9LvHIUbK7WtvE,479
14
- lintro/enums/group_by.py,sha256=Eb2rJpeTsPhCK-1xnsyogXrcH_pmNvDZ0dHRK1h4kzM,647
15
- lintro/enums/hadolint_enums.py,sha256=CY4ucR3CSQkHKGEFptZ6j3RU_saWmimPM9921Q4HgtI,1078
16
- lintro/enums/output_format.py,sha256=lw3omfjUJUdnrqFjUWVBRSBmWdrxIveS2z2JxFxYPlU,954
17
- lintro/enums/tool_name.py,sha256=LV09Wpuh2hkEo7Ei5BaIzSwqH8hLGZQ8NmmQOzwqqtI,796
18
- lintro/enums/tool_type.py,sha256=aa01LmewNr1DRuiHSJ0t5ZH3k933ZLbNYUC9gZXJDfI,829
19
- lintro/enums/yamllint_format.py,sha256=yKOeM10SBWKKAqsU0OohOpmZXp8M1lkbdUM0Pk20SPw,490
20
- lintro/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
- lintro/exceptions/errors.py,sha256=QnELwMd6yTZVMN7nKRElhxLmxo4JeKtb-HDmVNcZ72M,374
22
- lintro/formatters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- lintro/formatters/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- lintro/formatters/core/output_style.py,sha256=kr5kAWULozdj2dmHjbyferXuHMF4fx5hCTLIPWu3XRU,480
25
- lintro/formatters/core/table_descriptor.py,sha256=gLEhoGO0QQoPXM6ye3VxQ3oYG746j1EBbliCGmvpAos,586
26
- lintro/formatters/styles/__init__.py,sha256=rRGvbHhZpu09PJs0IbraFn3-yAYBxGVFv81hsnKkjiU,337
27
- lintro/formatters/styles/csv.py,sha256=Ghm-GElUeLwZFCRqZJvC2KxqQZqiD8jtIlY8Mz-PL5c,1026
28
- lintro/formatters/styles/grid.py,sha256=t1T1e4UzOxd9Rh3M58AJjud-DdmiugC_R0HvNpytQmk,2867
29
- lintro/formatters/styles/html.py,sha256=M1YVlzCKsV8_zaOearYwkPOHEVLcbV-tueXMJJcJbN8,1515
30
- lintro/formatters/styles/json.py,sha256=aZobZxntAiyo92_elI1VznrOd8jzEPrU7MUQBQHdM8Q,1923
31
- lintro/formatters/styles/markdown.py,sha256=proUn2UEhNceTw6mVv_KSBYinLekgATx58ZWiu_PT1U,1309
32
- lintro/formatters/styles/plain.py,sha256=_-4ziK6vBtvxI1wk-qLJHqKTUMs0SGWaBJPz1zV4Ngc,1125
33
- lintro/formatters/tools/__init__.py,sha256=5HxvLscHFl-dYv0h_X6_-rEaszdVU-XPNtL-ZkliGvU,1289
34
- lintro/formatters/tools/actionlint_formatter.py,sha256=GiUlD7DSW375seiPNLwdX3mOjtcn56T7z7ho4nQzEz8,2812
35
- lintro/formatters/tools/bandit_formatter.py,sha256=WP7haIWGjIPuGZf1FQ5Ixi5DKIySHGdX-L7hZcKnFuw,3093
36
- lintro/formatters/tools/black_formatter.py,sha256=xFmcmdfgQributNqQRBtp7MwPfR6QKFCsBo6urk0tDY,1623
37
- lintro/formatters/tools/darglint_formatter.py,sha256=NG5V32PX7PnxOccisyXYy02TVUp15r1dzwZzC9KQRsw,2202
38
- lintro/formatters/tools/hadolint_formatter.py,sha256=enugwgR571IFv-75HJ-RCrsK9GBZfH-Bwb-WjoJGd2Y,2608
39
- lintro/formatters/tools/prettier_formatter.py,sha256=VtV3uSoNhUtatqQa18QtQgcBAmzMPyjS2xDIAzpI0IY,2470
40
- lintro/formatters/tools/ruff_formatter.py,sha256=3R3ByBDN5YzR71cLOyNQMWLDkVU8qif_PweoTQXskkM,4011
41
- lintro/formatters/tools/yamllint_formatter.py,sha256=8IkW5gHcsQPn--1yj7Q2AAHnrSVM9BynAevZWq2vmDo,2701
42
- lintro/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- lintro/models/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- lintro/models/core/tool.py,sha256=TWkVV_KOYziqCdq_f3Goft3PKWKByitsQ2VFiX6MVHM,2594
45
- lintro/models/core/tool_config.py,sha256=_VHxiUc0V3e9e2VIVJCpoEQ66cijuNMtsiz5hQmVIus,804
46
- lintro/models/core/tool_result.py,sha256=z5fexuCBt1ir0hvzojxVX-Abt6MNIT7_JvH5oyW_FlI,1319
47
- lintro/parsers/__init__.py,sha256=53UA1LuS21BL4xj8i81Qb59dKXe3jCFLBrDVqvvNHVQ,288
48
- lintro/parsers/actionlint/__init__.py,sha256=N953d0kbJEOZE9cG4eq9BjiSErdk10GMrngV_tKjLvo,33
49
- lintro/parsers/actionlint/actionlint_issue.py,sha256=H_BQr04KAGHpVp1qKqETcWLi3i-u6atl7ccDae-jqX8,636
50
- lintro/parsers/actionlint/actionlint_parser.py,sha256=FAovzY877UeaDj7ZHb0zy6Y_hsidWS6UR1O8KCYVISU,1889
51
- lintro/parsers/black/black_issue.py,sha256=RwrT7n8aw4Nybakv83eXoeUxZlDtHwicWKNfrHYIYOg,507
52
- lintro/parsers/black/black_parser.py,sha256=mCbEy4aTRtxC_SKKPNK6hThGEu8C0m9EnliFW__Sa3Y,2958
53
- lintro/parsers/darglint/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
- lintro/parsers/darglint/darglint_issue.py,sha256=f43blLSM13r1VyyGwk-bjtC7raBCjRqwlnPw7Nmx9ic,127
55
- lintro/parsers/darglint/darglint_parser.py,sha256=pbIGnmHVKjf8OaxvhQbDWWXAFZEictb3FfuhoGv_I00,2046
56
- lintro/parsers/hadolint/__init__.py,sha256=vU33M_cj6fyg7aqZthz8MFUMfBIshX_Nx3DNuQmbHD4,30
57
- lintro/parsers/hadolint/hadolint_issue.py,sha256=VlTzTPHcluFZihFL-Tkg7UuXp1fQcD03eDCH0sr1qHU,582
58
- lintro/parsers/hadolint/hadolint_parser.py,sha256=Q7Hf6sL45s38O3C9dbBYzOpDlb0KGFj0U3Yry_ixdK8,1810
59
- lintro/parsers/prettier/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
- lintro/parsers/prettier/prettier_issue.py,sha256=yeOUmkb79mhYmidcx-iZgxvsNl_jkjT3ZCqT_Vo27rw,164
61
- lintro/parsers/prettier/prettier_parser.py,sha256=lH50rhFHbWWLH50CiTlyIvjgbx9vz1hiIdtxEXi7uJw,2043
62
- lintro/parsers/ruff/__init__.py,sha256=1oT00c82qKfveRqa4FnSedAEQjQVrb9BspJEUQJn-Kk,26
63
- lintro/parsers/ruff/ruff_issue.py,sha256=96ht6YWImOBiRTo0ATlM1PvVhgIwFiuN8810emm9nXo,1142
64
- lintro/parsers/ruff/ruff_parser.py,sha256=dwNaDgb-96DPuIiAgtHa0E1lTtzr2FLeWdZD_LVZhxE,4576
65
- lintro/parsers/yamllint/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
- lintro/parsers/yamllint/yamllint_issue.py,sha256=jWawdGUiTI1HADbhg8yEdZfC6yHcmk9FDzpr3PBUPBg,608
67
- lintro/parsers/yamllint/yamllint_parser.py,sha256=ol44xhJcspnGIsEta8vVv1xi-sIbpB12CovmT94QFmQ,1947
68
- lintro/tools/__init__.py,sha256=S-L_x7Hzp-Ja-QezupEUwF6-uhRl4ZXSIpRx59jvsaA,1410
69
- lintro/tools/tool_enum.py,sha256=ECok554KLqeLuU2xyLl1fcqzh77x9ojc-6Z7CRBRQUU,851
70
- lintro/tools/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
- lintro/tools/core/tool_base.py,sha256=pnu1sMwPuICCOy_CZRip6HhvHVSYfs7q5Sfpi9zUX9E,12360
72
- lintro/tools/core/tool_manager.py,sha256=yKQONy17t7-fq1k9dkrMk6lZaAvaSwp7-JcvJFZMoYc,5103
73
- lintro/tools/implementations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
- lintro/tools/implementations/tool_actionlint.py,sha256=7b1pUxs9Ln6KmoLiRQBmyDeq9SmgZ08e0DxleM9NEt8,5466
75
- lintro/tools/implementations/tool_bandit.py,sha256=Ck1fT8I9CSRTJ8zYqXYsVMQ_-HSp_VzUcB6GWuTahvI,15939
76
- lintro/tools/implementations/tool_black.py,sha256=x1U6NhdRxxYE5Tmvh-LoxcWtIkwHceeJWMUROa9tAJ4,9680
77
- lintro/tools/implementations/tool_darglint.py,sha256=zj8hQ8bVW3fwO8dsK9tdXzyL1yzZvqiEetVGvxhGe4g,9396
78
- lintro/tools/implementations/tool_hadolint.py,sha256=NfHLoThp23V-n5chSfrBZetleXsRR4oYxkLxOkJxU0g,11479
79
- lintro/tools/implementations/tool_prettier.py,sha256=ecpeG0sqbTRIQ5KziiwN8gmlPzoKHebdC2AkEKHUWrk,9447
80
- lintro/tools/implementations/tool_ruff.py,sha256=8WIpOKSc6HmuvEFCWgTqBX9X4T3MSD-RKesv4bs2lpQ,25361
81
- lintro/tools/implementations/tool_yamllint.py,sha256=0powR9F3FkIq-b7PI0-XWdh7nx7rR3HVMtvEaz_NWeA,8831
82
- lintro/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
- lintro/utils/ascii_normalize_cli.py,sha256=8Pi9XHIIIYCyPCq-JOAPnj5tYbz6XLmFLO7KypCv3EA,2408
84
- lintro/utils/config.py,sha256=3AVwNAteT-enN6Ica8jJbPwEFO94i4F7uWiEA1HSpJY,1427
85
- lintro/utils/console_logger.py,sha256=N0n5LomG6MDqu4tSPbmhBsIB6lzpRl5M53tZx6EoF4k,33104
86
- lintro/utils/formatting.py,sha256=khC9hYBva5xqBV1IqNcivRH9gRdvWw6u6mh2TZLTy7E,5346
87
- lintro/utils/output_manager.py,sha256=oIE0g8LNVQcWSQOb1MbDVqGYPrOjBGuUZ4R80M1RevQ,10213
88
- lintro/utils/path_utils.py,sha256=NJP3vjVDcRBgUHtYNrpL0tRa0Sc3oQhGX3_2WWzdZE4,1395
89
- lintro/utils/tool_executor.py,sha256=8-m7nQKLRlKHBTvzT7iLmaHYZ3-2s0t4zUbC-py8-H8,26204
90
- lintro/utils/tool_utils.py,sha256=zobweCIANBxXxHUERajFDshQyZGlEnJPQ52NleOrDdQ,15884
91
- lintro-0.6.2.dist-info/licenses/LICENSE,sha256=CwaAnyD2psonDBBJjbqFUz00W8nQw-FGDlEGZReUV6A,1069
92
- lintro-0.6.2.dist-info/METADATA,sha256=7ZshSHCtBvY2jyAfxEqQNUfsI4CLwCAbIJiMrAsHJb8,13881
93
- lintro-0.6.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
94
- lintro-0.6.2.dist-info/entry_points.txt,sha256=SYSk35jFyNLEHyrofSJsRv4qFN9NsT4VWSbvnTS9ov0,43
95
- lintro-0.6.2.dist-info/top_level.txt,sha256=_D-7eyV6gNBOoIwHuf_h60wN_RWiw8GxB430Il9VKhU,7
96
- lintro-0.6.2.dist-info/RECORD,,