djlint 1.28.0 → 1.30.0

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 (368) hide show
  1. package/.coveragerc +9 -0
  2. package/.editorconfig +21 -0
  3. package/.flake8 +0 -0
  4. package/.github/FUNDING.yml +2 -0
  5. package/.github/ISSUE_TEMPLATE/config.yml +6 -0
  6. package/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
  7. package/.github/ISSUE_TEMPLATE/formatter_but_report.md +30 -0
  8. package/.github/ISSUE_TEMPLATE/linter_bug_report.md +34 -0
  9. package/.github/ISSUE_TEMPLATE/translation.md +14 -0
  10. package/.github/config.yml +4 -0
  11. package/.github/pull_request_template.md +10 -0
  12. package/.github/workflows/cancel.yml +17 -0
  13. package/.github/workflows/demo.yml +98 -0
  14. package/.github/workflows/issues.yml +23 -0
  15. package/.github/workflows/linkcheck.yaml +21 -0
  16. package/.github/workflows/lint.yml +25 -0
  17. package/.github/workflows/release.yml +57 -0
  18. package/.github/workflows/test.yml +85 -0
  19. package/.pre-commit-config.yaml +45 -0
  20. package/.pre-commit-hooks.yaml +71 -0
  21. package/.prettierignore +7 -0
  22. package/.prettierrc +11 -0
  23. package/.releaserc +16 -0
  24. package/CHANGELOG.md +13 -0
  25. package/MANIFEST.in +2 -0
  26. package/build_demo.sh +17 -0
  27. package/docs/.eleventy.js +425 -0
  28. package/docs/.eleventyignore +2 -0
  29. package/docs/.prettierignore +3 -0
  30. package/docs/.prettierrc +11 -0
  31. package/docs/package.json +73 -0
  32. package/docs/readme.md +17 -0
  33. package/docs/src/_data/configuration.json +646 -0
  34. package/docs/src/_data/eleventyComputed.js +22 -0
  35. package/docs/src/_data/i18n/index.js +159 -0
  36. package/docs/src/_data/js.js +7 -0
  37. package/docs/src/_data/locales.js +17 -0
  38. package/docs/src/_data/site.json +8 -0
  39. package/docs/src/_includes/demo.njk +157 -0
  40. package/docs/src/_includes/docs_layout.njk +34 -0
  41. package/docs/src/_includes/foot.njk +26 -0
  42. package/docs/src/_includes/index.njk +187 -0
  43. package/docs/src/_includes/languages_layout.njk +11 -0
  44. package/docs/src/_includes/layout.njk +111 -0
  45. package/docs/src/_includes/nav.njk +85 -0
  46. package/docs/src/_utils/minify-html.js +14 -0
  47. package/docs/src/_utils/rollupper.js +91 -0
  48. package/docs/src/_utils/scripts.11ty.js +27 -0
  49. package/docs/src/demo.njk +4 -0
  50. package/docs/src/docs/best-practices.md +78 -0
  51. package/docs/src/docs/changelog.md +452 -0
  52. package/docs/src/docs/configuration.md +145 -0
  53. package/docs/src/docs/docs.json +4 -0
  54. package/docs/src/docs/formatter.md +82 -0
  55. package/docs/src/docs/getting-started.md +126 -0
  56. package/docs/src/docs/ignoring-code.md +75 -0
  57. package/docs/src/docs/integrations.md +120 -0
  58. package/docs/src/docs/languages/angular.md +31 -0
  59. package/docs/src/docs/languages/django.md +40 -0
  60. package/docs/src/docs/languages/golang.md +31 -0
  61. package/docs/src/docs/languages/handlebars.md +31 -0
  62. package/docs/src/docs/languages/jinja.md +39 -0
  63. package/docs/src/docs/languages/languages.json +3 -0
  64. package/docs/src/docs/languages/mustache.md +31 -0
  65. package/docs/src/docs/languages/nunjucks.md +39 -0
  66. package/docs/src/docs/languages/twig.md +41 -0
  67. package/docs/src/docs/linter.md +199 -0
  68. package/docs/src/fr/demo.njk +4 -0
  69. package/docs/src/fr/docs/best-practices.md +78 -0
  70. package/docs/src/fr/docs/changelog.md +452 -0
  71. package/docs/src/fr/docs/configuration.md +144 -0
  72. package/docs/src/fr/docs/docs.json +3 -0
  73. package/docs/src/fr/docs/formatter.md +83 -0
  74. package/docs/src/fr/docs/getting-started.md +127 -0
  75. package/docs/src/fr/docs/ignoring-code.md +75 -0
  76. package/docs/src/fr/docs/integrations.md +100 -0
  77. package/docs/src/fr/docs/languages/angular.md +31 -0
  78. package/docs/src/fr/docs/languages/django.md +31 -0
  79. package/docs/src/fr/docs/languages/golang.md +31 -0
  80. package/docs/src/fr/docs/languages/handlebars.md +31 -0
  81. package/docs/src/fr/docs/languages/jinja.md +31 -0
  82. package/docs/src/fr/docs/languages/languages.json +3 -0
  83. package/docs/src/fr/docs/languages/mustache.md +31 -0
  84. package/docs/src/fr/docs/languages/nunjucks.md +31 -0
  85. package/docs/src/fr/docs/languages/twig.md +31 -0
  86. package/docs/src/fr/docs/linter.md +207 -0
  87. package/docs/src/fr/fr.json +4 -0
  88. package/docs/src/fr/index.njk +4 -0
  89. package/docs/src/index.njk +4 -0
  90. package/docs/src/lib/generate-content-hash.js +13 -0
  91. package/docs/src/robots.txt +4 -0
  92. package/docs/src/ru/demo.njk +4 -0
  93. package/docs/src/ru/docs/best-practices.md +78 -0
  94. package/docs/src/ru/docs/changelog.md +453 -0
  95. package/docs/src/ru/docs/configuration.md +142 -0
  96. package/docs/src/ru/docs/docs.json +3 -0
  97. package/docs/src/ru/docs/formatter.md +82 -0
  98. package/docs/src/ru/docs/getting-started.md +127 -0
  99. package/docs/src/ru/docs/ignoring-code.md +75 -0
  100. package/docs/src/ru/docs/integrations.md +100 -0
  101. package/docs/src/ru/docs/languages/angular.md +31 -0
  102. package/docs/src/ru/docs/languages/django.md +31 -0
  103. package/docs/src/ru/docs/languages/golang.md +31 -0
  104. package/docs/src/ru/docs/languages/handlebars.md +31 -0
  105. package/docs/src/ru/docs/languages/jinja.md +31 -0
  106. package/docs/src/ru/docs/languages/languages.json +3 -0
  107. package/docs/src/ru/docs/languages/mustache.md +31 -0
  108. package/docs/src/ru/docs/languages/nunjucks.md +31 -0
  109. package/docs/src/ru/docs/languages/twig.md +31 -0
  110. package/docs/src/ru/docs/linter.md +126 -0
  111. package/docs/src/ru/index.njk +4 -0
  112. package/docs/src/ru/ru.json +4 -0
  113. package/docs/src/sitemap.njk +16 -0
  114. package/docs/src/static/css/site.scss +467 -0
  115. package/docs/src/static/font/fontawesome/stylesheet.scss +78 -0
  116. package/docs/src/static/img/apple-touch-icon.png +0 -0
  117. package/docs/src/static/img/demo-min.gif +0 -0
  118. package/docs/src/static/img/demo.gif +0 -0
  119. package/docs/src/static/img/demo.webm +0 -0
  120. package/docs/src/static/img/favicon-16x16.png +0 -0
  121. package/docs/src/static/img/favicon-32x32.png +0 -0
  122. package/docs/src/static/img/favicon.ico +0 -0
  123. package/docs/src/static/img/icon-square.indd +0 -0
  124. package/docs/src/static/img/icon-square.png +0 -0
  125. package/docs/src/static/img/icon.png +0 -0
  126. package/docs/src/static/img/logo-192x192.png +0 -0
  127. package/docs/src/static/img/logo-512x512.png +0 -0
  128. package/docs/src/static/img/logos/angular.png +0 -0
  129. package/docs/src/static/img/logos/django.png +0 -0
  130. package/docs/src/static/img/logos/golang.png +0 -0
  131. package/docs/src/static/img/logos/handlebars.png +0 -0
  132. package/docs/src/static/img/logos/jinja.png +0 -0
  133. package/docs/src/static/img/logos/mustache.png +0 -0
  134. package/docs/src/static/img/logos/nunjucks.png +0 -0
  135. package/docs/src/static/img/logos/twig.png +0 -0
  136. package/docs/src/static/img/old_demo.gif +0 -0
  137. package/docs/src/static/img/style.css +122 -0
  138. package/docs/src/static/js/animate.js +69 -0
  139. package/docs/src/static/js/editor.js +171 -0
  140. package/docs/src/static/js/hamburger.js +19 -0
  141. package/docs/src/static/js/modal.js +47 -0
  142. package/docs/src/static/js/worker.js +142 -0
  143. package/docs/src/static/py/EditorConfig-99-py3-none-any.whl +0 -0
  144. package/docs/src/static/py/PyYAML-99-py3-none-any.whl +0 -0
  145. package/docs/src/static/py/click-99-py3-none-any.whl +0 -0
  146. package/docs/src/static/py/colorama-99-py3-none-any.whl +0 -0
  147. package/docs/src/static/py/cssbeautifier-99-py3-none-any.whl +0 -0
  148. package/docs/src/static/py/djlint-99-py3-none-any.whl +0 -0
  149. package/docs/src/static/py/html_tag_names-99-py3-none-any.whl +0 -0
  150. package/docs/src/static/py/html_void_elements-99-py3-none-any.whl +0 -0
  151. package/docs/src/static/py/jsbeautifier-99-py3-none-any.whl +0 -0
  152. package/docs/src/static/py/json5-99-py3-none-any.whl +0 -0
  153. package/docs/src/static/py/pathspec-99-py3-none-any.whl +0 -0
  154. package/docs/src/static/py/regex-2023.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl +0 -0
  155. package/docs/src/static/py/six-1.16.0-py2.py3-none-any.whl +0 -0
  156. package/docs/src/static/py/tomli-2.0.1-py3-none-any.whl +0 -0
  157. package/docs/src/static/py/tqdm-4.65.0-py3-none-any.whl +0 -0
  158. package/icon.xcf +0 -0
  159. package/package.json +4 -33
  160. package/poetry.lock +835 -0
  161. package/pyproject.toml +100 -0
  162. package/renovate.json +44 -0
  163. package/scripts/updateVersion.js +16 -0
  164. package/src/djlint/__init__.py +451 -0
  165. package/src/djlint/__main__.py +4 -0
  166. package/src/djlint/formatter/__init__.py +1 -0
  167. package/src/djlint/formatter/attributes.py +212 -0
  168. package/src/djlint/formatter/compress.py +64 -0
  169. package/src/djlint/formatter/condense.py +221 -0
  170. package/src/djlint/formatter/css.py +60 -0
  171. package/src/djlint/formatter/expand.py +111 -0
  172. package/src/djlint/formatter/indent.py +418 -0
  173. package/src/djlint/formatter/js.py +58 -0
  174. package/src/djlint/helpers.py +321 -0
  175. package/src/djlint/lint.py +128 -0
  176. package/src/djlint/output.py +220 -0
  177. package/src/djlint/reformat.py +63 -0
  178. package/src/djlint/rules/H025.py +65 -0
  179. package/src/djlint/rules.yaml +279 -0
  180. package/src/djlint/settings.py +969 -0
  181. package/src/djlint/src.py +91 -0
  182. package/tests/__init__.py +0 -0
  183. package/tests/conftest.py +239 -0
  184. package/tests/test_cli.py +71 -0
  185. package/tests/test_config/__init__.py +0 -0
  186. package/tests/test_config/test_blank_line_after_tag.py +135 -0
  187. package/tests/test_config/test_blank_line_before_tag.py +141 -0
  188. package/tests/test_config/test_close_void_tags.py +31 -0
  189. package/tests/test_config/test_custom_blocks.py +56 -0
  190. package/tests/test_config/test_custom_html.py +45 -0
  191. package/tests/test_config/test_djlintrc/.djlintrc +38 -0
  192. package/tests/test_config/test_djlintrc/__init__.py +0 -0
  193. package/tests/test_config/test_djlintrc/test_config.py +44 -0
  194. package/tests/test_config/test_djlintrc_custom/.djlint-cust +38 -0
  195. package/tests/test_config/test_djlintrc_custom/.djlintrc +2 -0
  196. package/tests/test_config/test_djlintrc_custom/__init__.py +0 -0
  197. package/tests/test_config/test_djlintrc_custom/test_config.py +48 -0
  198. package/tests/test_config/test_excludes/__init__.py +0 -0
  199. package/tests/test_config/test_excludes/excluded.html +1 -0
  200. package/tests/test_config/test_excludes/foo/excluded.html +1 -0
  201. package/tests/test_config/test_excludes/html.html +1 -0
  202. package/tests/test_config/test_excludes/pyproject.toml +3 -0
  203. package/tests/test_config/test_excludes/test_config.py +30 -0
  204. package/tests/test_config/test_extension/__init__.py +0 -0
  205. package/tests/test_config/test_extension/html.test +1 -0
  206. package/tests/test_config/test_extension/pyproject.toml +3 -0
  207. package/tests/test_config/test_extension/test_config.py +27 -0
  208. package/tests/test_config/test_files/.djlintrc_global +9 -0
  209. package/tests/test_config/test_files/test.html +3 -0
  210. package/tests/test_config/test_files/test_config.py +123 -0
  211. package/tests/test_config/test_files/test_two.html +1 -0
  212. package/tests/test_config/test_format_attribute_template_tags.py +280 -0
  213. package/tests/test_config/test_format_css.py +197 -0
  214. package/tests/test_config/test_format_js.py +220 -0
  215. package/tests/test_config/test_gitignore/__init__.py +0 -0
  216. package/tests/test_config/test_gitignore/html_one.html +1 -0
  217. package/tests/test_config/test_gitignore/html_two.html +1 -0
  218. package/tests/test_config/test_gitignore/test_config.py +142 -0
  219. package/tests/test_config/test_ignore/__init__.py +0 -0
  220. package/tests/test_config/test_ignore/html.html +1 -0
  221. package/tests/test_config/test_ignore/html_two.html +12 -0
  222. package/tests/test_config/test_ignore/pyproject.toml +3 -0
  223. package/tests/test_config/test_ignore/test_config.py +32 -0
  224. package/tests/test_config/test_ignore_blocks.py +45 -0
  225. package/tests/test_config/test_ignore_case.py +39 -0
  226. package/tests/test_config/test_indent.py +63 -0
  227. package/tests/test_config/test_linter_output_format/__init__.py +0 -0
  228. package/tests/test_config/test_linter_output_format/html-one.html +1 -0
  229. package/tests/test_config/test_linter_output_format/html-two.html +1 -0
  230. package/tests/test_config/test_linter_output_format/pyproject.toml +3 -0
  231. package/tests/test_config/test_linter_output_format/test_config.py +34 -0
  232. package/tests/test_config/test_max_attribute_length.py +100 -0
  233. package/tests/test_config/test_max_line_length.py +94 -0
  234. package/tests/test_config/test_per_file_ignores/__init__.py +0 -0
  235. package/tests/test_config/test_per_file_ignores/html.html +2 -0
  236. package/tests/test_config/test_per_file_ignores/pyproject.toml +2 -0
  237. package/tests/test_config/test_per_file_ignores/test_config.py +25 -0
  238. package/tests/test_config/test_pragmas/__init__.py +0 -0
  239. package/tests/test_config/test_pragmas/html_five.html +2 -0
  240. package/tests/test_config/test_pragmas/html_four.html +5 -0
  241. package/tests/test_config/test_pragmas/html_one.html +1 -0
  242. package/tests/test_config/test_pragmas/html_six.html +2 -0
  243. package/tests/test_config/test_pragmas/html_three.html +4 -0
  244. package/tests/test_config/test_pragmas/html_two.html +2 -0
  245. package/tests/test_config/test_pragmas/pyproject.toml +3 -0
  246. package/tests/test_config/test_pragmas/test_config.py +142 -0
  247. package/tests/test_config/test_preserve_blank_lines.py +109 -0
  248. package/tests/test_config/test_preserve_leading_space.py +159 -0
  249. package/tests/test_config/test_profile/__init__.py +0 -0
  250. package/tests/test_config/test_profile/html.html +2 -0
  251. package/tests/test_config/test_profile/pyproject.toml +3 -0
  252. package/tests/test_config/test_profile/test_config.py +64 -0
  253. package/tests/test_config/test_pyproject/__init__.py +0 -0
  254. package/tests/test_config/test_pyproject/blank.html +0 -0
  255. package/tests/test_config/test_pyproject/pyproject.toml +36 -0
  256. package/tests/test_config/test_pyproject/test_config.py +44 -0
  257. package/tests/test_django/__init__.py +0 -0
  258. package/tests/test_django/test_asset.py +32 -0
  259. package/tests/test_django/test_autoescape.py +25 -0
  260. package/tests/test_django/test_block.py +29 -0
  261. package/tests/test_django/test_blocktrans.py +236 -0
  262. package/tests/test_django/test_blocktrans_trimmed.py +283 -0
  263. package/tests/test_django/test_comments.py +164 -0
  264. package/tests/test_django/test_filter.py +30 -0
  265. package/tests/test_django/test_for.py +34 -0
  266. package/tests/test_django/test_if.py +34 -0
  267. package/tests/test_django/test_ifchanged.py +37 -0
  268. package/tests/test_django/test_include.py +24 -0
  269. package/tests/test_django/test_load.py +24 -0
  270. package/tests/test_django/test_quoted.py +34 -0
  271. package/tests/test_django/test_spaceless.py +30 -0
  272. package/tests/test_django/test_tag_spaces.py +35 -0
  273. package/tests/test_django/test_templatetag.py +40 -0
  274. package/tests/test_django/test_verbatim.py +24 -0
  275. package/tests/test_django/test_with.py +32 -0
  276. package/tests/test_djlint/-.html +1 -0
  277. package/tests/test_djlint/__init__.py +0 -0
  278. package/tests/test_djlint/bad.html +6 -0
  279. package/tests/test_djlint/bad.html.dj +23 -0
  280. package/tests/test_djlint/bad.html.dj2 +2 -0
  281. package/tests/test_djlint/multiple_files/a/a.html +1 -0
  282. package/tests/test_djlint/multiple_files/b/b1.html +1 -0
  283. package/tests/test_djlint/multiple_files/b/b2.html +1 -0
  284. package/tests/test_djlint/test_djlint.py +242 -0
  285. package/tests/test_golang/__init__.py +0 -0
  286. package/tests/test_golang/test_if.py +24 -0
  287. package/tests/test_golang/test_range.py +24 -0
  288. package/tests/test_handlebars/__init__.py +0 -0
  289. package/tests/test_handlebars/test_each.py +34 -0
  290. package/tests/test_handlebars/test_else.py +24 -0
  291. package/tests/test_handlebars/test_with.py +24 -0
  292. package/tests/test_html/__init__.py +0 -0
  293. package/tests/test_html/test_alpinejs.py +65 -0
  294. package/tests/test_html/test_attributes.py +935 -0
  295. package/tests/test_html/test_aurelia.py +24 -0
  296. package/tests/test_html/test_basics.py +905 -0
  297. package/tests/test_html/test_bracket_same_line.py +177 -0
  298. package/tests/test_html/test_case.py +81 -0
  299. package/tests/test_html/test_cdata.py +34 -0
  300. package/tests/test_html/test_comments.py +333 -0
  301. package/tests/test_html/test_css.py +193 -0
  302. package/tests/test_html/test_doctype_declarations.py +202 -0
  303. package/tests/test_html/test_ignored.py +193 -0
  304. package/tests/test_html/test_interpolation.py +56 -0
  305. package/tests/test_html/test_line_break_after_multiline_tag.py +95 -0
  306. package/tests/test_html/test_next_line_empty.py +53 -0
  307. package/tests/test_html/test_selfclosing.py +55 -0
  308. package/tests/test_html/test_single_attribute_per_line.py +87 -0
  309. package/tests/test_html/test_srcset.py +43 -0
  310. package/tests/test_html/test_svg.py +104 -0
  311. package/tests/test_html/test_symbol_entities.py +34 -0
  312. package/tests/test_html/test_tag_code.py +24 -0
  313. package/tests/test_html/test_tag_dd.py +24 -0
  314. package/tests/test_html/test_tag_details_summary.py +24 -0
  315. package/tests/test_html/test_tag_dt.py +24 -0
  316. package/tests/test_html/test_tag_fig_caption.py +29 -0
  317. package/tests/test_html/test_tag_hr.py +29 -0
  318. package/tests/test_html/test_tag_picture.py +32 -0
  319. package/tests/test_html/test_tag_pre.py +45 -0
  320. package/tests/test_html/test_tag_script.py +516 -0
  321. package/tests/test_html/test_tag_small.py +24 -0
  322. package/tests/test_html/test_tag_span.py +119 -0
  323. package/tests/test_html/test_tag_textarea.py +82 -0
  324. package/tests/test_html/test_tags.py +842 -0
  325. package/tests/test_html/test_text.py +34 -0
  326. package/tests/test_html/test_whitespace.py +477 -0
  327. package/tests/test_html/test_yaml.py +156 -0
  328. package/tests/test_jinja/__init__.py +0 -0
  329. package/tests/test_jinja/test_call.py +34 -0
  330. package/tests/test_jinja/test_parenthesis.py +24 -0
  331. package/tests/test_linter/__init__.py +0 -0
  332. package/tests/test_linter/test_custom_rules/.djlint_rules.yaml +6 -0
  333. package/tests/test_linter/test_custom_rules/__init__.py +0 -0
  334. package/tests/test_linter/test_custom_rules/html.html +1 -0
  335. package/tests/test_linter/test_custom_rules/pyproject.toml +1 -0
  336. package/tests/test_linter/test_custom_rules/test_linter.py +29 -0
  337. package/tests/test_linter/test_custom_rules_bad/.djlint_rules.yaml +24 -0
  338. package/tests/test_linter/test_custom_rules_bad/__init__.py +0 -0
  339. package/tests/test_linter/test_custom_rules_bad/html.html +1 -0
  340. package/tests/test_linter/test_custom_rules_bad/pyproject.toml +1 -0
  341. package/tests/test_linter/test_custom_rules_bad/test_linter.py +29 -0
  342. package/tests/test_linter/test_django_linter.py +476 -0
  343. package/tests/test_linter/test_h005.py +45 -0
  344. package/tests/test_linter/test_h006.py +81 -0
  345. package/tests/test_linter/test_h007.py +45 -0
  346. package/tests/test_linter/test_h008.py +60 -0
  347. package/tests/test_linter/test_h009.py +45 -0
  348. package/tests/test_linter/test_h010.py +44 -0
  349. package/tests/test_linter/test_h037.py +150 -0
  350. package/tests/test_linter/test_ignore_rules.py +45 -0
  351. package/tests/test_linter/test_jinja_linter.py +227 -0
  352. package/tests/test_linter/test_linter.py +691 -0
  353. package/tests/test_linter/test_nunjucks_linter.py +59 -0
  354. package/tests/test_linter/test_python_module_rules/.djlint_rules.yaml +4 -0
  355. package/tests/test_linter/test_python_module_rules/__init__.py +0 -0
  356. package/tests/test_linter/test_python_module_rules/html_bad.html +3 -0
  357. package/tests/test_linter/test_python_module_rules/html_ok.html +3 -0
  358. package/tests/test_linter/test_python_module_rules/my_module.py +32 -0
  359. package/tests/test_linter/test_python_module_rules/pyproject.toml +1 -0
  360. package/tests/test_linter/test_python_module_rules/test_linter.py +26 -0
  361. package/tests/test_nunjucks/__init__.py +0 -0
  362. package/tests/test_nunjucks/test_functions.py +94 -0
  363. package/tests/test_nunjucks/test_macros.py +41 -0
  364. package/tests/test_nunjucks/test_set.py +206 -0
  365. package/tests/test_nunjucks/test_spaceless.py +24 -0
  366. package/tests/test_twig/__init__.py +0 -0
  367. package/tests/test_twig/test_comments.py +51 -0
  368. package/tox.ini +48 -0
@@ -0,0 +1,100 @@
1
+ """Test for max_attribute_length.
2
+
3
+ --max-attribute-length 4
4
+
5
+ poetry run pytest tests/test_config/test_max_attribute_length.py
6
+ """
7
+ import pytest
8
+
9
+ from src.djlint.reformat import formatter
10
+ from tests.conftest import config_builder, printer
11
+
12
+ test_data = [
13
+ pytest.param(
14
+ (
15
+ '<div required long attributenamesarereallycool class="asdf" data-attr="asdf" id="asdf" ></div>\n'
16
+ '<div class="my long classes" required="true"\n'
17
+ ' checked="checked"\n'
18
+ ' data-attr="some long junk"\n'
19
+ ' style="margin-left: 90px;\n'
20
+ " display: contents;\n"
21
+ " font-weight: bold;\n"
22
+ ' font-size: 1.5rem">\n'
23
+ ),
24
+ (
25
+ "<div required\n"
26
+ " long\n"
27
+ " attributenamesarereallycool\n"
28
+ ' class="asdf"\n'
29
+ ' data-attr="asdf"\n'
30
+ ' id="asdf">\n'
31
+ "</div>\n"
32
+ '<div class="my long classes"\n'
33
+ ' required="true"\n'
34
+ ' checked="checked"\n'
35
+ ' data-attr="some long junk"\n'
36
+ ' style="margin-left: 90px;\n'
37
+ " display: contents;\n"
38
+ " font-weight: bold;\n"
39
+ ' font-size: 1.5rem">\n'
40
+ ),
41
+ ({"max_attribute_length": 10, "max_line_length": 1}),
42
+ id="short lines",
43
+ ),
44
+ pytest.param(
45
+ (
46
+ '<div required long attributenamesarereallycool class="asdf" data-attr="asdf" id="asdf" ></div>\n'
47
+ '<div class="my long classes" required="true"\n'
48
+ ' checked="checked"\n'
49
+ ' data-attr="some long junk"\n'
50
+ ' style="margin-left: 90px;\n'
51
+ " display: contents;\n"
52
+ " font-weight: bold;\n"
53
+ ' font-size: 1.5rem">\n'
54
+ ),
55
+ (
56
+ "<div required\n"
57
+ " long\n"
58
+ " attributenamesarereallycool\n"
59
+ ' class="asdf"\n'
60
+ ' data-attr="asdf"\n'
61
+ ' id="asdf"></div>\n'
62
+ '<div class="my long classes"\n'
63
+ ' required="true"\n'
64
+ ' checked="checked"\n'
65
+ ' data-attr="some long junk"\n'
66
+ ' style="margin-left: 90px;\n'
67
+ " display: contents;\n"
68
+ " font-weight: bold;\n"
69
+ ' font-size: 1.5rem">\n'
70
+ ),
71
+ ({"max_attribute_length": 10, "max_line_length": 1000}),
72
+ id="longer lines",
73
+ ),
74
+ pytest.param(
75
+ (
76
+ '<div required long attributenamesarereallycool class="asdf" data-attr="asdf" id="asdf" ></div>\n'
77
+ '<div class="my long classes" required="true"\n'
78
+ ' checked="checked"\n'
79
+ ' data-attr="some long junk"\n'
80
+ ' style="margin-left: 90px;\n'
81
+ " display: contents;\n"
82
+ " font-weight: bold;\n"
83
+ ' font-size: 1.5rem">\n'
84
+ ),
85
+ (
86
+ '<div required long attributenamesarereallycool class="asdf" data-attr="asdf" id="asdf"></div>\n'
87
+ '<div class="my long classes" required="true" checked="checked" data-attr="some long junk" style="margin-left: 90px; display: contents; font-weight: bold; font-size: 1.5rem">\n'
88
+ ),
89
+ ({"max_attribute_length": 10000, "max_line_length": 1000}),
90
+ id="longest lines",
91
+ ),
92
+ ]
93
+
94
+
95
+ @pytest.mark.parametrize(("source", "expected", "args"), test_data)
96
+ def test_base(source, expected, args):
97
+ output = formatter(config_builder(args), source)
98
+
99
+ printer(expected, source, output)
100
+ assert expected == output
@@ -0,0 +1,94 @@
1
+ """Test for max line length.
2
+
3
+ --max-line-length 4
4
+
5
+ poetry run pytest tests/test_config/test_max_line_length.py
6
+ """
7
+ import pytest
8
+
9
+ from src.djlint.reformat import formatter
10
+ from tests.conftest import config_builder, printer
11
+
12
+ test_data = [
13
+ pytest.param(
14
+ (
15
+ '<div required long attributenamesarereallycool class="asdf" data-attr="asdf" id="asdf" ></div>\n'
16
+ '<div class="my long classes" required="true"\n'
17
+ ' checked="checked"\n'
18
+ ' data-attr="some long junk"\n'
19
+ ' style="margin-left: 90px;\n'
20
+ " display: contents;\n"
21
+ " font-weight: bold;\n"
22
+ ' font-size: 1.5rem">\n'
23
+ ),
24
+ (
25
+ "<div required\n"
26
+ " long\n"
27
+ " attributenamesarereallycool\n"
28
+ ' class="asdf"\n'
29
+ ' data-attr="asdf"\n'
30
+ ' id="asdf">\n'
31
+ "</div>\n"
32
+ '<div class="my long classes"\n'
33
+ ' required="true"\n'
34
+ ' checked="checked"\n'
35
+ ' data-attr="some long junk"\n'
36
+ ' style="margin-left: 90px;\n'
37
+ " display: contents;\n"
38
+ " font-weight: bold;\n"
39
+ ' font-size: 1.5rem">\n'
40
+ ),
41
+ ({"max_line_length": 1}),
42
+ id="short lines",
43
+ ),
44
+ pytest.param(
45
+ (
46
+ '<div required long attributenamesarereallycool class="asdf" data-attr="asdf" id="asdf" ></div>\n'
47
+ '<div class="my long classes" required="true"\n'
48
+ ' checked="checked"\n'
49
+ ' data-attr="some long junk"\n'
50
+ ' style="margin-left: 90px;\n'
51
+ " display: contents;\n"
52
+ " font-weight: bold;\n"
53
+ ' font-size: 1.5rem">\n'
54
+ ),
55
+ (
56
+ "<div required\n"
57
+ " long\n"
58
+ " attributenamesarereallycool\n"
59
+ ' class="asdf"\n'
60
+ ' data-attr="asdf"\n'
61
+ ' id="asdf"></div>\n'
62
+ '<div class="my long classes"\n'
63
+ ' required="true"\n'
64
+ ' checked="checked"\n'
65
+ ' data-attr="some long junk"\n'
66
+ ' style="margin-left: 90px;\n'
67
+ " display: contents;\n"
68
+ " font-weight: bold;\n"
69
+ ' font-size: 1.5rem">\n'
70
+ ),
71
+ ({"max_line_length": 1000}),
72
+ id="longer lines",
73
+ ),
74
+ pytest.param(
75
+ ("<div></div>\n"),
76
+ ("<div></div>\n"),
77
+ ({"max_line_length": 12}),
78
+ id="twelve",
79
+ ),
80
+ pytest.param(
81
+ ("<div></div>\n"),
82
+ ("<div>\n" "</div>\n"),
83
+ ({"max_line_length": 11}),
84
+ id="eleven",
85
+ ),
86
+ ]
87
+
88
+
89
+ @pytest.mark.parametrize(("source", "expected", "args"), test_data)
90
+ def test_base(source, expected, args):
91
+ output = formatter(config_builder(args), source)
92
+
93
+ printer(expected, source, output)
94
+ assert expected == output
@@ -0,0 +1,2 @@
1
+ <div>
2
+ <div></div>
@@ -0,0 +1,2 @@
1
+ [tool.djlint.per-file-ignores]
2
+ "html.html"= "H025"
@@ -0,0 +1,25 @@
1
+ """Djlint tests specific to pyproject.toml configuration.
2
+
3
+ run::
4
+
5
+ pytest tests/test_config/test_per_file_ignores/test_config.py --cov=src/djlint --cov-branch \
6
+ --cov-report xml:coverage.xml --cov-report term-missing
7
+
8
+ for a single test, run::
9
+
10
+ pytest tests/test_config.py::test_custom_html --cov=src/djlint \
11
+ --cov-branch --cov-report xml:coverage.xml --cov-report term-missing
12
+
13
+ """
14
+ # pylint: disable=C0116
15
+
16
+
17
+ from click.testing import CliRunner
18
+
19
+ from src.djlint import main as djlint
20
+
21
+
22
+ def test_ignores(runner: CliRunner) -> None:
23
+ result = runner.invoke(djlint, ["tests/test_config/test_per_file_ignores"])
24
+ assert "H025" not in result.output
25
+ assert "H020" in result.output
File without changes
@@ -0,0 +1,2 @@
1
+ <!-- djlint:on -->
2
+ {% extends "nothing.html" %}{% load stuff %}{% load stuff 2 %}{% include "html_two.html" %}<div></div>
@@ -0,0 +1,5 @@
1
+ {{ /* djlint:on */ }}
2
+ <h1>Test</h1><p>{{ .Variable }}</p>
3
+ {{ range .Items }} <p>{{ . }}
4
+
5
+ </p>{{ end }}
@@ -0,0 +1 @@
1
+ {% extends "nothing.html" %}{% load stuff %}{% load stuff 2 %}{% include "html_two.html" %}<div></div>
@@ -0,0 +1,2 @@
1
+ {% comment %} djlint:on {% endcomment %}
2
+ {% extends "nothing.html" %}{% load stuff %}{% load stuff 2 %}{% include "html_two.html" %}<div></div>
@@ -0,0 +1,4 @@
1
+ {{!-- djlint:on --}}
2
+ <p>
3
+
4
+ {{firstname}} </p><p>{{lastname}}</p>
@@ -0,0 +1,2 @@
1
+ {# djlint:on #}
2
+ {% extends "nothing.html" %}{% load stuff %}{% load stuff 2 %}{% include "html_two.html" %}<div></div>
@@ -0,0 +1,3 @@
1
+ [tool]
2
+ [tool.djlint]
3
+ require_pragma=true
@@ -0,0 +1,142 @@
1
+ """Djlint tests specific to pyproject.toml configuration.
2
+
3
+ run::
4
+
5
+ pytest tests/test_config/test_pragmas/test_config.py --cov=src/djlint --cov-branch \
6
+ --cov-report xml:coverage.xml --cov-report term-missing
7
+
8
+ pytest tests/test_config/test_pragmas/test_config.py::test_require_pragma
9
+
10
+ """
11
+ # pylint: disable=C0116
12
+
13
+
14
+ from click.testing import CliRunner
15
+
16
+ from src.djlint import main as djlint
17
+
18
+
19
+ def test_require_pragma(runner: CliRunner) -> None:
20
+ result = runner.invoke(
21
+ djlint,
22
+ [
23
+ "tests/test_config/test_pragmas/html_one.html",
24
+ "--lint",
25
+ "--check",
26
+ "--profile",
27
+ "django",
28
+ ],
29
+ )
30
+
31
+ assert """No files to check!""" in result.output
32
+ assert result.exit_code == 0
33
+
34
+ result = runner.invoke(
35
+ djlint,
36
+ [
37
+ "tests/test_config/test_pragmas/html_two.html",
38
+ "--check",
39
+ "--profile",
40
+ "django",
41
+ ],
42
+ )
43
+ assert (
44
+ """ {# djlint:on #}
45
+ -{% extends "nothing.html" %}{% load stuff %}{% load stuff 2 %}{% include "html_two.html" %}<div></div>
46
+ +{% extends "nothing.html" %}
47
+ +{% load stuff %}
48
+ +{% load stuff 2 %}
49
+ +{% include "html_two.html" %}
50
+ +<div></div>"""
51
+ in result.output
52
+ )
53
+ assert """1 file would be updated.""" in result.output
54
+ assert result.exit_code == 1
55
+
56
+ result = runner.invoke(
57
+ djlint,
58
+ [
59
+ "tests/test_config/test_pragmas/html_three.html",
60
+ "--check",
61
+ "--profile",
62
+ "handlebars",
63
+ ],
64
+ )
65
+
66
+ assert (
67
+ """ {{!-- djlint:on --}}
68
+ -<p>
69
+ -
70
+ -{{firstname}} </p><p>{{lastname}}</p>
71
+ +<p>{{firstname}}</p>
72
+ +<p>{{lastname}}</p>"""
73
+ in result.output
74
+ )
75
+ assert """1 file would be updated.""" in result.output
76
+ assert result.exit_code == 1
77
+
78
+ result = runner.invoke(
79
+ djlint,
80
+ [
81
+ "tests/test_config/test_pragmas/html_four.html",
82
+ "--check",
83
+ "--profile",
84
+ "golang",
85
+ ],
86
+ )
87
+
88
+ assert (
89
+ """ {{ /* djlint:on */ }}
90
+ -<h1>Test</h1><p>{{ .Variable }}</p>
91
+ -{{ range .Items }} <p>{{ . }}
92
+ -
93
+ -</p>{{ end }}
94
+ +<h1>Test</h1>
95
+ +<p>{{ .Variable }}</p>
96
+ +{{ range .Items }}
97
+ +<p>{{ . }}</p>
98
+ +{{ end }}
99
+
100
+ 1 file would be updated."""
101
+ in result.output
102
+ )
103
+ assert """1 file would be updated.""" in result.output
104
+ assert result.exit_code == 1
105
+
106
+ result = runner.invoke(
107
+ djlint, ["tests/test_config/test_pragmas/html_five.html", "--check"]
108
+ )
109
+ assert (
110
+ """ <!-- djlint:on -->
111
+ -{% extends "nothing.html" %}{% load stuff %}{% load stuff 2 %}{% include "html_two.html" %}<div></div>
112
+ +{% extends "nothing.html" %}
113
+ +{% load stuff %}
114
+ +{% load stuff 2 %}
115
+ +{% include "html_two.html" %}
116
+ +<div></div>"""
117
+ in result.output
118
+ )
119
+ assert """1 file would be updated.""" in result.output
120
+ assert result.exit_code == 1
121
+
122
+ result = runner.invoke(
123
+ djlint,
124
+ [
125
+ "tests/test_config/test_pragmas/html_six.html",
126
+ "--check",
127
+ "--profile",
128
+ "django",
129
+ ],
130
+ )
131
+ assert (
132
+ """ {% comment %} djlint:on {% endcomment %}
133
+ -{% extends "nothing.html" %}{% load stuff %}{% load stuff 2 %}{% include "html_two.html" %}<div></div>
134
+ +{% extends "nothing.html" %}
135
+ +{% load stuff %}
136
+ +{% load stuff 2 %}
137
+ +{% include "html_two.html" %}
138
+ +<div></div>"""
139
+ in result.output
140
+ )
141
+ assert """1 file would be updated.""" in result.output
142
+ assert result.exit_code == 1
@@ -0,0 +1,109 @@
1
+ """Test for preserve blank lines.
2
+
3
+ --preserve-blank-lines
4
+
5
+ poetry run pytest tests/test_config/test_preserve_blank_lines.py
6
+ """
7
+ import pytest
8
+
9
+ from src.djlint.reformat import formatter
10
+ from tests.conftest import config_builder, printer
11
+
12
+ test_data = [
13
+ pytest.param(
14
+ (
15
+ "---\n"
16
+ "my:yaml\n"
17
+ "---\n"
18
+ "\n"
19
+ "\n"
20
+ "\n"
21
+ "\n"
22
+ "{% if abc == 101 %}\n"
23
+ " interface Ethernet1/2\n"
24
+ " description // Connected to leaf-2\n"
25
+ " no switchport\n"
26
+ " ip address 10.1.2.1/30\n"
27
+ " ip router ospf 1 area 0.0.0.0\n"
28
+ " no shutdown\n"
29
+ "{% endif %}\n"
30
+ "\n"
31
+ "\n"
32
+ "{% if abc == 102 %}\n"
33
+ " interface Ethernet1/2\n"
34
+ " description // Connected to leaf-2\n"
35
+ " no switchport\n"
36
+ " ip address 10.1.2.1/30\n"
37
+ " ip router ospf 1 area 0.0.0.0\n"
38
+ " no shutdown\n"
39
+ "{% endif %}\n"
40
+ "\n"
41
+ "{% if abc == 103 %}\n"
42
+ " interface Ethernet1/2\n"
43
+ " description // Connected to leaf-2\n"
44
+ " no switchport\n"
45
+ " ip address 10.1.2.1/30\n"
46
+ " ip router ospf 1 area 0.0.0.0\n"
47
+ " no shutdown\n"
48
+ "{% endif %}\n"
49
+ ),
50
+ (
51
+ "---\n"
52
+ "my:yaml\n"
53
+ "---\n"
54
+ "\n"
55
+ "\n"
56
+ "\n"
57
+ "\n"
58
+ "{% if abc == 101 %}\n"
59
+ " interface Ethernet1/2\n"
60
+ " description // Connected to leaf-2\n"
61
+ " no switchport\n"
62
+ " ip address 10.1.2.1/30\n"
63
+ " ip router ospf 1 area 0.0.0.0\n"
64
+ " no shutdown\n"
65
+ "{% endif %}\n"
66
+ "\n"
67
+ "\n"
68
+ "{% if abc == 102 %}\n"
69
+ " interface Ethernet1/2\n"
70
+ " description // Connected to leaf-2\n"
71
+ " no switchport\n"
72
+ " ip address 10.1.2.1/30\n"
73
+ " ip router ospf 1 area 0.0.0.0\n"
74
+ " no shutdown\n"
75
+ "{% endif %}\n"
76
+ "\n"
77
+ "{% if abc == 103 %}\n"
78
+ " interface Ethernet1/2\n"
79
+ " description // Connected to leaf-2\n"
80
+ " no switchport\n"
81
+ " ip address 10.1.2.1/30\n"
82
+ " ip router ospf 1 area 0.0.0.0\n"
83
+ " no shutdown\n"
84
+ "{% endif %}\n"
85
+ ),
86
+ ({"preserve_blank_lines": True, "preserve_leading_space": True}),
87
+ id="network stuff",
88
+ ),
89
+ pytest.param(
90
+ ("{% block someblock %}{% endblock %}\n" "<br />\n" "<br />\n"),
91
+ ("{% block someblock %}{% endblock %}\n" "<br />\n" "<br />\n"),
92
+ ({"preserve_blank_lines": True}),
93
+ id="whitespace test",
94
+ ),
95
+ pytest.param(
96
+ ("<div>"),
97
+ ("<div>\n"),
98
+ ({"preserve_blank_lines": True}),
99
+ id="whitespace test",
100
+ ),
101
+ ]
102
+
103
+
104
+ @pytest.mark.parametrize(("source", "expected", "args"), test_data)
105
+ def test_base(source, expected, args):
106
+ output = formatter(config_builder(args), source)
107
+
108
+ printer(expected, source, output)
109
+ assert expected == output
@@ -0,0 +1,159 @@
1
+ """Test for preserve leading space.
2
+
3
+ --preserve-leading-space
4
+
5
+ poetry run pytest tests/test_config/test_preserve_leading_space.py
6
+ """
7
+ import pytest
8
+
9
+ from src.djlint.reformat import formatter
10
+ from tests.conftest import config_builder, printer
11
+
12
+ test_data = [
13
+ pytest.param(
14
+ (
15
+ "---\n"
16
+ "my:yaml\n"
17
+ "---\n"
18
+ "\n"
19
+ "\n"
20
+ "\n"
21
+ "\n"
22
+ "{% if abc == 101 %}\n"
23
+ " interface Ethernet1/2\n"
24
+ " description // Connected to leaf-2\n"
25
+ " no switchport\n"
26
+ " ip address 10.1.2.1/30\n"
27
+ " ip router ospf 1 area 0.0.0.0\n"
28
+ " no shutdown\n"
29
+ "{% endif %}\n"
30
+ "\n"
31
+ "\n"
32
+ "{% if abc == 102 %}\n"
33
+ " interface Ethernet1/2\n"
34
+ " description // Connected to leaf-2\n"
35
+ " no switchport\n"
36
+ " ip address 10.1.2.1/30\n"
37
+ " ip router ospf 1 area 0.0.0.0\n"
38
+ " no shutdown\n"
39
+ "{% endif %}\n"
40
+ "\n"
41
+ "{% if abc == 103 %}\n"
42
+ " interface Ethernet1/2\n"
43
+ " description // Connected to leaf-2\n"
44
+ " no switchport\n"
45
+ " ip address 10.1.2.1/30\n"
46
+ " ip router ospf 1 area 0.0.0.0\n"
47
+ " no shutdown\n"
48
+ "{% endif %}\n"
49
+ ),
50
+ (
51
+ "---\n"
52
+ "my:yaml\n"
53
+ "---\n"
54
+ "\n"
55
+ "\n"
56
+ "\n"
57
+ "\n"
58
+ "{% if abc == 101 %}\n"
59
+ " interface Ethernet1/2\n"
60
+ " description // Connected to leaf-2\n"
61
+ " no switchport\n"
62
+ " ip address 10.1.2.1/30\n"
63
+ " ip router ospf 1 area 0.0.0.0\n"
64
+ " no shutdown\n"
65
+ "{% endif %}\n"
66
+ "\n"
67
+ "\n"
68
+ "{% if abc == 102 %}\n"
69
+ " interface Ethernet1/2\n"
70
+ " description // Connected to leaf-2\n"
71
+ " no switchport\n"
72
+ " ip address 10.1.2.1/30\n"
73
+ " ip router ospf 1 area 0.0.0.0\n"
74
+ " no shutdown\n"
75
+ "{% endif %}\n"
76
+ "\n"
77
+ "{% if abc == 103 %}\n"
78
+ " interface Ethernet1/2\n"
79
+ " description // Connected to leaf-2\n"
80
+ " no switchport\n"
81
+ " ip address 10.1.2.1/30\n"
82
+ " ip router ospf 1 area 0.0.0.0\n"
83
+ " no shutdown\n"
84
+ "{% endif %}\n"
85
+ ),
86
+ ({"preserve_blank_lines": True, "preserve_leading_space": True}),
87
+ id="network stuff",
88
+ ),
89
+ pytest.param(
90
+ (
91
+ "{% if abc == 101 %}\n"
92
+ " interface Ethernet1/2\n"
93
+ " description // Connected to leaf-2\n"
94
+ " no switchport\n"
95
+ " ip address 10.1.2.1/30\n"
96
+ " ip router ospf 1 area 0.0.0.0\n"
97
+ " no shutdown\n"
98
+ "{% endif %}\n"
99
+ "\n"
100
+ "\n"
101
+ " {% if abc == 102 %}\n"
102
+ " interface Ethernet1/2\n"
103
+ " description // Connected to leaf-2\n"
104
+ " no switchport\n"
105
+ " ip address 10.1.2.1/30\n"
106
+ " ip router ospf 1 area 0.0.0.0\n"
107
+ " no shutdown\n"
108
+ " {% endif %}\n"
109
+ "\n"
110
+ "{% if abc == 103 %}\n"
111
+ " interface Ethernet1/2\n"
112
+ " description // Connected to leaf-2\n"
113
+ " no switchport\n"
114
+ " ip address 10.1.2.1/30\n"
115
+ " ip router ospf 1 area 0.0.0.0\n"
116
+ " no shutdown\n"
117
+ " {% endif %}\n"
118
+ ),
119
+ (
120
+ "{% if abc == 101 %}\n"
121
+ " interface Ethernet1/2\n"
122
+ " description // Connected to leaf-2\n"
123
+ " no switchport\n"
124
+ " ip address 10.1.2.1/30\n"
125
+ " ip router ospf 1 area 0.0.0.0\n"
126
+ " no shutdown\n"
127
+ "{% endif %}\n"
128
+ "\n"
129
+ "\n"
130
+ "{% if abc == 102 %}\n"
131
+ " interface Ethernet1/2\n"
132
+ " description // Connected to leaf-2\n"
133
+ " no switchport\n"
134
+ " ip address 10.1.2.1/30\n"
135
+ " ip router ospf 1 area 0.0.0.0\n"
136
+ " no shutdown\n"
137
+ "{% endif %}\n"
138
+ "\n"
139
+ "{% if abc == 103 %}\n"
140
+ " interface Ethernet1/2\n"
141
+ " description // Connected to leaf-2\n"
142
+ " no switchport\n"
143
+ " ip address 10.1.2.1/30\n"
144
+ " ip router ospf 1 area 0.0.0.0\n"
145
+ " no shutdown\n"
146
+ "{% endif %}\n"
147
+ ),
148
+ ({"preserve_blank_lines": True, "preserve_leading_space": True}),
149
+ id="network stuff",
150
+ ),
151
+ ]
152
+
153
+
154
+ @pytest.mark.parametrize(("source", "expected", "args"), test_data)
155
+ def test_base(source, expected, args):
156
+ output = formatter(config_builder(args), source)
157
+
158
+ printer(expected, source, output)
159
+ assert expected == output
File without changes