Compare commits

..

530 Commits
v1.2.0 ... main

Author SHA1 Message Date
renovate[bot]
c2093cd70b
chore(docker): update python:3.13-alpine docker digest to fcbcbbe (#808)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-14 01:50:25 +01:00
renovate[bot]
62f9e10d3b
chore(docker): update python:3.13-alpine docker digest to ee60f1f (#807)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-13 03:51:53 +01:00
renovate[bot]
de052569b4
chore(deps): update dependency ruff to v0.7.3 (#806)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-11 02:09:59 +01:00
renovate[bot]
5a3d733342
chore(deps): update python docker tag to v3.13 (#791)
BREAKING CHANGE: The support for Python 3.9 was removed.
2024-11-08 23:11:01 +01:00
renovate[bot]
b79a51e328
chore(deps): update docker.io/library/python docker tag to v3.13 (#790)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-08 21:54:16 +01:00
renovate[bot]
888302e9b8
fix(deps): update dependency ansible-core to v2.14.18 [security] (#805)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-06 21:46:36 +01:00
renovate[bot]
e909e50d93
chore(deps): update dependency thegeeklab/hugo-geekdoc to v1.2.1 (#802)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-04 03:26:13 +01:00
renovate[bot]
cdacf56720
chore(deps): update dependency ruff to v0.7.2 (#801)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-04 03:25:57 +01:00
renovate[bot]
66de803a3b
chore(deps): update dependency pytest-cov to v6 (#800)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-30 08:46:54 +01:00
renovate[bot]
885af6e035
chore(deps): update quay.io/thegeeklab/hugo docker tag to v0.136.5 (#798)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-28 08:35:27 +01:00
renovate[bot]
2f0ad8457e
chore(deps): lock file maintenance (#793)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-28 08:32:10 +01:00
renovate[bot]
14da079897
chore(deps): update dependency ruff to v0.7.1 (#799)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-28 03:00:39 +01:00
16f07f1059
cleanup docs pipeline 2024-10-27 21:21:07 +01:00
68167b5636
ci: add trivy and replace deprecated workflow syntax (#797) 2024-10-27 21:11:00 +01:00
renovate[bot]
9c77a76567
chore(deps): update dependency ruff to v0.7.0 (#795)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-21 03:44:35 +02:00
renovate[bot]
0d5c516057
chore(docker): update python:3.12-alpine docker digest to 38e179a (#794)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-20 02:17:17 +02:00
ee2cb214a9
fix: unify value format of tabulated vars (#792) 2024-10-08 10:08:06 +02:00
4bb11fd6cd
feat: add to_code filter and enable codeblocks for tabulated vars (#784) 2024-10-08 08:26:25 +02:00
renovate[bot]
56864c153f
chore(deps): lock file maintenance (#788)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-07 21:11:50 +02:00
renovate[bot]
a581a7edf0
chore(deps): update dependency thegeeklab/hugo-geekdoc to v1.1.0 (#787)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-07 02:40:28 +02:00
renovate[bot]
e28cf48457
chore(deps): update dependency ruff to v0.6.9 (#786)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-07 02:40:14 +02:00
080b317738
re-generate examples readme 2024-10-03 14:53:01 +02:00
e85b64fa60
add bool var to examples 2024-10-03 14:52:30 +02:00
renovate[bot]
bc39d9f957
chore(deps): lock file maintenance (#779)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-03 14:28:29 +02:00
renovate[bot]
31c0186e37
chore(docker): update python:3.12-alpine docker digest to e75de17 (#783)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-03 05:58:39 +02:00
renovate[bot]
c0a7ccdbf7
chore(docker): update python:3.12-alpine docker digest to cf0a168 (#782)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-02 05:29:03 +02:00
renovate[bot]
478be48ad6
chore(deps): update dependency ruff to v0.6.8 (#778)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 05:31:49 +02:00
renovate[bot]
f62ddc8720
chore(deps): lock file maintenance (#777)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-23 11:19:36 +02:00
renovate[bot]
c163d34ade
chore(deps): update dependency ruff to v0.6.7 (#776)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-23 02:55:27 +02:00
dependabot[bot]
863f4db8a8
chore(deps): bump cryptography from 42.0.8 to 43.0.1 (#775)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-20 09:27:02 +02:00
renovate[bot]
36e6adcb8c
chore(deps): lock file maintenance (#774)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-20 08:49:16 +02:00
renovate[bot]
2d42158503
chore(deps): update devdeps non-major (#773)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [pytest](https://redirect.github.com/pytest-dev/pytest)
([changelog](https://docs.pytest.org/en/stable/changelog.html)) |
`8.3.2` -> `8.3.3` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/pytest/8.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pytest/8.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pytest/8.3.2/8.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pytest/8.3.2/8.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [ruff](https://docs.astral.sh/ruff)
([source](https://redirect.github.com/astral-sh/ruff),
[changelog](https://redirect.github.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `0.6.4` -> `0.6.5` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.6.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.6.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.6.4/0.6.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.6.4/0.6.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>pytest-dev/pytest (pytest)</summary>

###
[`v8.3.3`](https://redirect.github.com/pytest-dev/pytest/releases/tag/8.3.3)

[Compare
Source](https://redirect.github.com/pytest-dev/pytest/compare/8.3.2...8.3.3)

# pytest 8.3.3 (2024-09-09)

## Bug fixes

-
[#&#8203;12446](https://redirect.github.com/pytest-dev/pytest/issues/12446):
Avoid calling `@property` (and other instance descriptors) during
fixture discovery -- by `asottile`{.interpreted-text role="user"}

-
[#&#8203;12659](https://redirect.github.com/pytest-dev/pytest/issues/12659):
Fixed the issue of not displaying assertion failure differences when
using the parameter `--import-mode=importlib` in pytest>=8.1.

-
[#&#8203;12667](https://redirect.github.com/pytest-dev/pytest/issues/12667):
Fixed a regression where type change in
\[ExceptionInfo.errisinstance]{.title-ref} caused \[mypy]{.title-ref} to
fail.

-
[#&#8203;12744](https://redirect.github.com/pytest-dev/pytest/issues/12744):
Fixed typing compatibility with Python 3.9 or less -- replaced
\[typing.Self]{.title-ref} with \[typing_extensions.Self]{.title-ref} --
by `Avasam`{.interpreted-text role="user"}

-
[#&#8203;12745](https://redirect.github.com/pytest-dev/pytest/issues/12745):
Fixed an issue with backslashes being incorrectly converted in nodeid
paths on Windows, ensuring consistent path handling across environments.

-
[#&#8203;6682](https://redirect.github.com/pytest-dev/pytest/issues/6682):
Fixed bug where the verbosity levels where not being respected when
printing the "msg" part of failed assertion (as in `assert condition,
msg`).

-
[#&#8203;9422](https://redirect.github.com/pytest-dev/pytest/issues/9422):
Fix bug where disabling the terminal plugin via `-p no:terminal` would
cause crashes related to missing the `verbose` option.

    \-- by `GTowers1`{.interpreted-text role="user"}

## Improved documentation

-
[#&#8203;12663](https://redirect.github.com/pytest-dev/pytest/issues/12663):
Clarify that the \[pytest_deselected]{.title-ref} hook should be called
from \[pytest_collection_modifyitems]{.title-ref} hook implementations
when items are deselected.
-
[#&#8203;12678](https://redirect.github.com/pytest-dev/pytest/issues/12678):
Remove erroneous quotes from \[tmp_path_retention_policy]{.title-ref}
example in docs.

## Miscellaneous internal changes

-
[#&#8203;12769](https://redirect.github.com/pytest-dev/pytest/issues/12769):
Fix typos discovered by codespell and add codespell to pre-commit hooks.

</details>

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.6.5`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#065)

[Compare
Source](https://redirect.github.com/astral-sh/ruff/compare/0.6.4...0.6.5)

##### Preview features

- \[`pydoclint`] Ignore `DOC201` when function name is "**new**"
([#&#8203;13300](https://redirect.github.com/astral-sh/ruff/pull/13300))
- \[`refurb`] Implement `slice-to-remove-prefix-or-suffix` (`FURB188`)
([#&#8203;13256](https://redirect.github.com/astral-sh/ruff/pull/13256))

##### Rule changes

- \[`eradicate`] Ignore script-comments with multiple end-tags
(`ERA001`)
([#&#8203;13283](https://redirect.github.com/astral-sh/ruff/pull/13283))
- \[`pyflakes`] Improve error message for `UndefinedName` when a builtin
was added in a newer version than specified in Ruff config (`F821`)
([#&#8203;13293](https://redirect.github.com/astral-sh/ruff/pull/13293))

##### Server

- Add support for extensionless Python files for server
([#&#8203;13326](https://redirect.github.com/astral-sh/ruff/pull/13326))
- Fix configuration inheritance for configurations specified in the LSP
settings
([#&#8203;13285](https://redirect.github.com/astral-sh/ruff/pull/13285))

##### Bug fixes

- \[`ruff`] Handle unary operators in `decimal-from-float-literal`
(`RUF032`)
([#&#8203;13275](https://redirect.github.com/astral-sh/ruff/pull/13275))

##### CLI

- Only include rules with diagnostics in SARIF metadata
([#&#8203;13268](https://redirect.github.com/astral-sh/ruff/pull/13268))

##### Playground

- Add "Copy as pyproject.toml/ruff.toml" and "Paste from TOML"
([#&#8203;13328](https://redirect.github.com/astral-sh/ruff/pull/13328))
- Fix errors not shown for restored snippet on page load
([#&#8203;13262](https://redirect.github.com/astral-sh/ruff/pull/13262))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC43NC4xIiwidXBkYXRlZEluVmVyIjoiMzguNzQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-16 02:21:27 +02:00
renovate[bot]
58fa1ef151
chore(docker): update python:3.12-alpine docker digest to 7130f75 (#772)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `7593fc6` -> `7130f75` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC43NC4xIiwidXBkYXRlZEluVmVyIjoiMzguNzQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-14 02:22:18 +02:00
renovate[bot]
21c9619572
chore(docker): update python:3.12-alpine docker digest to 7593fc6 (#771)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `e0e4d3d` -> `7593fc6` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC43NC4xIiwidXBkYXRlZEluVmVyIjoiMzguNzQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-13 05:20:06 +02:00
renovate[bot]
5f3381723b
chore(deps): update quay.io/thegeeklab/hugo docker tag to v0.133.0 (#759)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-11 22:44:58 +02:00
renovate[bot]
5a2534c0fe
chore(deps): lock file maintenance (#743)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-11 21:57:12 +02:00
renovate[bot]
ed951f499a
chore(deps): update dependency thegeeklab/hugo-geekdoc to v1 (#761)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-11 21:56:55 +02:00
renovate[bot]
f3763ea8bb
chore(docker): update python:3.12-alpine docker digest to e0e4d3d (#770)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `98a1fdb` -> `e0e4d3d` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC41OS4yIiwidXBkYXRlZEluVmVyIjoiMzguNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-10 05:36:03 +02:00
renovate[bot]
b594c4c191
chore(docker): update python:3.12-alpine docker digest to 98a1fdb (#769)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `bb5d0ac` -> `98a1fdb` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC41OS4yIiwidXBkYXRlZEluVmVyIjoiMzguNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-10 03:21:17 +02:00
renovate[bot]
6fa2c73aad
chore(deps): update dependency ruff to v0.6.4 (#767)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [ruff](https://docs.astral.sh/ruff)
([source](https://redirect.github.com/astral-sh/ruff),
[changelog](https://redirect.github.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `0.6.3` -> `0.6.4` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.6.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.6.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.6.3/0.6.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.6.3/0.6.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.6.4`](https://redirect.github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#064)

[Compare
Source](https://redirect.github.com/astral-sh/ruff/compare/0.6.3...0.6.4)

##### Preview features

- \[`flake8-builtins`] Use dynamic builtins list based on Python version
([#&#8203;13172](https://redirect.github.com/astral-sh/ruff/pull/13172))
- \[`pydoclint`] Permit yielding `None` in `DOC402` and `DOC403`
([#&#8203;13148](https://redirect.github.com/astral-sh/ruff/pull/13148))
- \[`pylint`] Update diagnostic message for `PLW3201`
([#&#8203;13194](https://redirect.github.com/astral-sh/ruff/pull/13194))
- \[`ruff`] Implement `post-init-default` (`RUF033`)
([#&#8203;13192](https://redirect.github.com/astral-sh/ruff/pull/13192))
- \[`ruff`] Implement useless if-else (`RUF034`)
([#&#8203;13218](https://redirect.github.com/astral-sh/ruff/pull/13218))

##### Rule changes

- \[`flake8-pyi`] Respect `pep8_naming.classmethod-decorators` settings
when determining if a method is a classmethod in
`custom-type-var-return-type` (`PYI019`)
([#&#8203;13162](https://redirect.github.com/astral-sh/ruff/pull/13162))
- \[`flake8-pyi`] Teach various rules that annotations might be
stringized
([#&#8203;12951](https://redirect.github.com/astral-sh/ruff/pull/12951))
- \[`pylint`] Avoid `no-self-use` for `attrs`-style validators
([#&#8203;13166](https://redirect.github.com/astral-sh/ruff/pull/13166))
- \[`pylint`] Recurse into subscript subexpressions when searching for
list/dict lookups (`PLR1733`, `PLR1736`)
([#&#8203;13186](https://redirect.github.com/astral-sh/ruff/pull/13186))
- \[`pyupgrade`] Detect `aiofiles.open` calls in `UP015`
([#&#8203;13173](https://redirect.github.com/astral-sh/ruff/pull/13173))
- \[`pyupgrade`] Mark `sys.version_info[0] < 3` and similar comparisons
as outdated (`UP036`)
([#&#8203;13175](https://redirect.github.com/astral-sh/ruff/pull/13175))

##### CLI

- Enrich messages of SARIF results
([#&#8203;13180](https://redirect.github.com/astral-sh/ruff/pull/13180))
- Handle singular case for incompatible rules warning in `ruff format`
output
([#&#8203;13212](https://redirect.github.com/astral-sh/ruff/pull/13212))

##### Bug fixes

- \[`pydocstyle`] Improve heuristics for detecting Google-style
docstrings
([#&#8203;13142](https://redirect.github.com/astral-sh/ruff/pull/13142))
- \[`refurb`] Treat `sep` arguments with effects as unsafe removals
(`FURB105`)
([#&#8203;13165](https://redirect.github.com/astral-sh/ruff/pull/13165))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC41OS4yIiwidXBkYXRlZEluVmVyIjoiMzguNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-09 02:34:39 +02:00
renovate[bot]
f7ba5d05e9
chore(docker): update python:3.12-alpine docker digest to bb5d0ac (#766)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `4dae8a3` -> `bb5d0ac` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC41OS4yIiwidXBkYXRlZEluVmVyIjoiMzguNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-08 05:29:06 +02:00
renovate[bot]
989bb18da3
chore(docker): update python:3.12-alpine docker digest to 4dae8a3 (#765)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `aeff643` -> `4dae8a3` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC41OS4yIiwidXBkYXRlZEluVmVyIjoiMzguNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-07 05:51:16 +02:00
renovate[bot]
0a3c83cc31
chore(docker): update python:3.12-alpine docker digest to aeff643 (#764)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `c2f41e6` -> `aeff643` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC41OS4yIiwidXBkYXRlZEluVmVyIjoiMzguNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-05 03:11:16 +02:00
renovate[bot]
d8218b22b1
chore(deps): update dependency ruff to v0.6.3 (#762)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [ruff](https://docs.astral.sh/ruff)
([source](https://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `0.6.2` -> `0.6.3` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.6.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.6.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.6.2/0.6.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.6.2/0.6.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.6.3`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#063)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/0.6.2...0.6.3)

##### Preview features

- \[`flake8-simplify`] Extend `open-file-with-context-handler` to work
with `dbm.sqlite3` (`SIM115`)
([#&#8203;13104](https://togithub.com/astral-sh/ruff/pull/13104))
- \[`pycodestyle`] Disable `E741` in stub files (`.pyi`)
([#&#8203;13119](https://togithub.com/astral-sh/ruff/pull/13119))
- \[`pydoclint`] Avoid `DOC201` on explicit returns in functions that
only return `None`
([#&#8203;13064](https://togithub.com/astral-sh/ruff/pull/13064))

##### Rule changes

- \[`flake8-async`] Disable check for `asyncio` before Python 3.11
(`ASYNC109`)
([#&#8203;13023](https://togithub.com/astral-sh/ruff/pull/13023))

##### Bug fixes

- \[`FastAPI`] Avoid introducing invalid syntax in fix for
`fast-api-non-annotated-dependency` (`FAST002`)
([#&#8203;13133](https://togithub.com/astral-sh/ruff/pull/13133))
- \[`flake8-implicit-str-concat`] Normalize octals before merging
concatenated strings in `single-line-implicit-string-concatenation`
(`ISC001`)
([#&#8203;13118](https://togithub.com/astral-sh/ruff/pull/13118))
- \[`flake8-pytest-style`] Improve help message for
`pytest-incorrect-mark-parentheses-style` (`PT023`)
([#&#8203;13092](https://togithub.com/astral-sh/ruff/pull/13092))
- \[`pylint`] Avoid autofix for calls that aren't `min` or `max` as
starred expression (`PLW3301`)
([#&#8203;13089](https://togithub.com/astral-sh/ruff/pull/13089))
- \[`ruff`] Add `datetime.time`, `datetime.tzinfo`, and
`datetime.timezone` as immutable function calls (`RUF009`)
([#&#8203;13109](https://togithub.com/astral-sh/ruff/pull/13109))
- \[`ruff`] Extend comment deletion for `RUF100` to include trailing
text from `noqa` directives while preserving any following comments on
the same line, if any
([#&#8203;13105](https://togithub.com/astral-sh/ruff/pull/13105))
- Fix dark theme on initial page load for the Ruff playground
([#&#8203;13077](https://togithub.com/astral-sh/ruff/pull/13077))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC41Ni4wIiwidXBkYXRlZEluVmVyIjoiMzguNTYuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-02 03:07:52 +02:00
renovate[bot]
2ad04db4bf
chore(deps): update dependency ruff to v0.6.2 (#760)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [ruff](https://docs.astral.sh/ruff)
([source](https://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `0.6.1` -> `0.6.2` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.6.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.6.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.6.1/0.6.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.6.1/0.6.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.6.2`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#062)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/0.6.1...0.6.2)

##### Preview features

- \[`flake8-simplify`] Extend `open-file-with-context-handler` to work
with other standard-library IO modules (`SIM115`)
([#&#8203;12959](https://togithub.com/astral-sh/ruff/pull/12959))
- \[`ruff`] Avoid `unused-async` for functions with FastAPI route
decorator (`RUF029`)
([#&#8203;12938](https://togithub.com/astral-sh/ruff/pull/12938))
- \[`ruff`] Ignore `fstring-missing-syntax` (`RUF027`) for `fastAPI`
paths ([#&#8203;12939](https://togithub.com/astral-sh/ruff/pull/12939))
- \[`ruff`] Implement check for Decimal called with a float literal
(RUF032)
([#&#8203;12909](https://togithub.com/astral-sh/ruff/pull/12909))

##### Rule changes

- \[`flake8-bugbear`] Update diagnostic message when expression is at
the end of function (`B015`)
([#&#8203;12944](https://togithub.com/astral-sh/ruff/pull/12944))
- \[`flake8-pyi`] Skip type annotations in `string-or-bytes-too-long`
(`PYI053`)
([#&#8203;13002](https://togithub.com/astral-sh/ruff/pull/13002))
- \[`flake8-type-checking`] Always recognise relative imports as
first-party
([#&#8203;12994](https://togithub.com/astral-sh/ruff/pull/12994))
- \[`flake8-unused-arguments`] Ignore unused arguments on stub functions
(`ARG001`)
([#&#8203;12966](https://togithub.com/astral-sh/ruff/pull/12966))
- \[`pylint`] Ignore augmented assignment for `self-cls-assignment`
(`PLW0642`)
([#&#8203;12957](https://togithub.com/astral-sh/ruff/pull/12957))

##### Server

- Show full context in error log messages
([#&#8203;13029](https://togithub.com/astral-sh/ruff/pull/13029))

##### Bug fixes

- \[`pep8-naming`] Don't flag `from` imports following conventional
import names (`N817`)
([#&#8203;12946](https://togithub.com/astral-sh/ruff/pull/12946))
- \[`pylint`] - Allow `__new__` methods to have `cls` as their first
argument even if decorated with `@staticmethod` for
`bad-staticmethod-argument` (`PLW0211`)
([#&#8203;12958](https://togithub.com/astral-sh/ruff/pull/12958))

##### Documentation

- Add `hyperfine` installation instructions; update `hyperfine` code
samples
([#&#8203;13034](https://togithub.com/astral-sh/ruff/pull/13034))
- Expand note to use Ruff with other language server in Kate
([#&#8203;12806](https://togithub.com/astral-sh/ruff/pull/12806))
- Update example for `PT001` as per the new default behavior
([#&#8203;13019](https://togithub.com/astral-sh/ruff/pull/13019))
- \[`perflint`] Improve docs for `try-except-in-loop` (`PERF203`)
([#&#8203;12947](https://togithub.com/astral-sh/ruff/pull/12947))
- \[`pydocstyle`] Add reference to `lint.pydocstyle.ignore-decorators`
setting to rule docs
([#&#8203;12996](https://togithub.com/astral-sh/ruff/pull/12996))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4yNi4xIiwidXBkYXRlZEluVmVyIjoiMzguMjYuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-26 02:41:13 +02:00
renovate[bot]
cd8e9bbe5f
chore(deps): update dependency ruff to v0.6.1 (#758)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [ruff](https://docs.astral.sh/ruff)
([source](https://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `0.5.7` -> `0.6.1` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.6.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.6.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.5.7/0.6.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.5.7/0.6.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.6.1`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#061)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/0.6.0...0.6.1)

This is a hotfix release to address an issue with `ruff-pre-commit`. In
v0.6,
Ruff changed its behavior to lint and format Jupyter notebooks by
default;
however, due to an oversight, these files were still excluded by default
if
Ruff was run via pre-commit, leading to inconsistent behavior.
This has [now been
fixed](https://togithub.com/astral-sh/ruff-pre-commit/pull/96).

##### Preview features

- \[`fastapi`] Implement `fast-api-unused-path-parameter` (`FAST003`)
([#&#8203;12638](https://togithub.com/astral-sh/ruff/pull/12638))

##### Rule changes

- \[`pylint`] Rename `too-many-positional` to
`too-many-positional-arguments` (`R0917`)
([#&#8203;12905](https://togithub.com/astral-sh/ruff/pull/12905))

##### Server

- Fix crash when applying "fix-all" code-action to notebook cells
([#&#8203;12929](https://togithub.com/astral-sh/ruff/pull/12929))

##### Other changes

- \[`flake8-naming`]: Respect import conventions (`N817`)
([#&#8203;12922](https://togithub.com/astral-sh/ruff/pull/12922))

###
[`v0.6.0`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#060)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/0.5.7...0.6.0)

Check out the [blog post](https://astral.sh/blog/ruff-v0.6.0) for a
migration guide and overview of the changes!

##### Breaking changes

See also, the "Remapped rules" section which may result in disabled
rules.

- Lint and format Jupyter Notebook by default
([#&#8203;12878](https://togithub.com/astral-sh/ruff/pull/12878)).
- Detect imports in `src` layouts by default for `isort` rules
([#&#8203;12848](https://togithub.com/astral-sh/ruff/pull/12848))
- The pytest rules `PT001` and `PT023` now default to omitting the
decorator parentheses when there are no arguments
([#&#8203;12838](https://togithub.com/astral-sh/ruff/pull/12838)).

##### Deprecations

The following rules are now deprecated:

-
[`pytest-missing-fixture-name-underscore`](https://docs.astral.sh/ruff/rules/pytest-missing-fixture-name-underscore/)
(`PT004`)
-
[`pytest-incorrect-fixture-name-underscore`](https://docs.astral.sh/ruff/rules/pytest-incorrect-fixture-name-underscore/)
(`PT005`)
-
[`unpacked-list-comprehension`](https://docs.astral.sh/ruff/rules/unpacked-list-comprehension/)
(`UP027`)

##### Remapped rules

The following rules have been remapped to new rule codes:

-
[`unnecessary-dict-comprehension-for-iterable`](https://docs.astral.sh/ruff/rules/unnecessary-dict-comprehension-for-iterable/):
`RUF025` to `C420`

##### Stabilization

The following rules have been stabilized and are no longer in preview:

-
[`singledispatch-method`](https://docs.astral.sh/ruff/rules/singledispatch-method/)
(`PLE1519`)
-
[`singledispatchmethod-function`](https://docs.astral.sh/ruff/rules/singledispatchmethod-function/)
(`PLE1520`)
-
[`bad-staticmethod-argument`](https://docs.astral.sh/ruff/rules/bad-staticmethod-argument/)
(`PLW0211`)
-
[`if-stmt-min-max`](https://docs.astral.sh/ruff/rules/if-stmt-min-max/)
(`PLR1730`)
-
[`invalid-bytes-return-type`](https://docs.astral.sh/ruff/rules/invalid-bytes-return-type/)
(`PLE0308`)
-
[`invalid-hash-return-type`](https://docs.astral.sh/ruff/rules/invalid-hash-return-type/)
(`PLE0309`)
-
[`invalid-index-return-type`](https://docs.astral.sh/ruff/rules/invalid-index-return-type/)
(`PLE0305`)
-
[`invalid-length-return-type`](https://docs.astral.sh/ruff/rules/invalid-length-return-type/)
(`E303`)
-
[`self-or-cls-assignment`](https://docs.astral.sh/ruff/rules/self-or-cls-assignment/)
(`PLW0642`)
-
[`byte-string-usage`](https://docs.astral.sh/ruff/rules/byte-string-usage/)
(`PYI057`)
-
[`duplicate-literal-member`](https://docs.astral.sh/ruff/rules/duplicate-literal-member/)
(`PYI062`)
-
[`redirected-noqa`](https://docs.astral.sh/ruff/rules/redirected-noqa/)
(`RUF101`)

The following behaviors have been stabilized:

-
[`cancel-scope-no-checkpoint`](https://docs.astral.sh/ruff/rules/cancel-scope-no-checkpoint/)
(`ASYNC100`): Support `asyncio` and `anyio` context mangers.
-
[`async-function-with-timeout`](https://docs.astral.sh/ruff/rules/async-function-with-timeout/)
(`ASYNC109`): Support `asyncio` and `anyio` context mangers.
-
[`async-busy-wait`](https://docs.astral.sh/ruff/rules/async-busy-wait/)
(`ASYNC110`): Support `asyncio` and `anyio` context mangers.
-
[`async-zero-sleep`](https://docs.astral.sh/ruff/rules/async-zero-sleep/)
(`ASYNC115`): Support `anyio` context mangers.
-
[`long-sleep-not-forever`](https://docs.astral.sh/ruff/rules/long-sleep-not-forever/)
(`ASYNC116`): Support `anyio` context mangers.

The following fixes have been stabilized:

-
[`superfluous-else-return`](https://docs.astral.sh/ruff/rules/superfluous-else-return/)
(`RET505`)
-
[`superfluous-else-raise`](https://docs.astral.sh/ruff/rules/superfluous-else-raise/)
(`RET506`)
-
[`superfluous-else-continue`](https://docs.astral.sh/ruff/rules/superfluous-else-continue/)
(`RET507`)
-
[`superfluous-else-break`](https://docs.astral.sh/ruff/rules/superfluous-else-break/)
(`RET508`)

##### Preview features

- \[`flake8-simplify`] Further simplify to binary in preview for
(`SIM108`)
([#&#8203;12796](https://togithub.com/astral-sh/ruff/pull/12796))
- \[`pyupgrade`] Show violations without auto-fix (`UP031`)
([#&#8203;11229](https://togithub.com/astral-sh/ruff/pull/11229))

##### Rule changes

- \[`flake8-import-conventions`] Add `xml.etree.ElementTree` to default
conventions
([#&#8203;12455](https://togithub.com/astral-sh/ruff/pull/12455))
- \[`flake8-pytest-style`] Add a space after comma in CSV output
(`PT006`)
([#&#8203;12853](https://togithub.com/astral-sh/ruff/pull/12853))

##### Server

- Show a message for incorrect settings
([#&#8203;12781](https://togithub.com/astral-sh/ruff/pull/12781))

##### Bug fixes

- \[`flake8-async`] Do not lint yield in context manager (`ASYNC100`)
([#&#8203;12896](https://togithub.com/astral-sh/ruff/pull/12896))
- \[`flake8-comprehensions`] Do not lint `async for` comprehensions
(`C419`)
([#&#8203;12895](https://togithub.com/astral-sh/ruff/pull/12895))
- \[`flake8-return`] Only add return `None` at end of a function
(`RET503`)
([#&#8203;11074](https://togithub.com/astral-sh/ruff/pull/11074))
- \[`flake8-type-checking`] Avoid treating `dataclasses.KW_ONLY` as
typing-only (`TCH003`)
([#&#8203;12863](https://togithub.com/astral-sh/ruff/pull/12863))
- \[`pep8-naming`] Treat `type(Protocol)` et al as metaclass base
(`N805`)
([#&#8203;12770](https://togithub.com/astral-sh/ruff/pull/12770))
- \[`pydoclint`] Don't enforce returns and yields in abstract methods
(`DOC201`, `DOC202`)
([#&#8203;12771](https://togithub.com/astral-sh/ruff/pull/12771))
- \[`ruff`] Skip tuples with slice expressions in (`RUF031`)
([#&#8203;12768](https://togithub.com/astral-sh/ruff/pull/12768))
- \[`ruff`] Ignore unparenthesized tuples in subscripts when the
subscript is a type annotation or type alias (`RUF031`)
([#&#8203;12762](https://togithub.com/astral-sh/ruff/pull/12762))
- \[`ruff`] Ignore template strings passed to logging and `builtins._()`
calls (`RUF027`)
([#&#8203;12889](https://togithub.com/astral-sh/ruff/pull/12889))
- \[`ruff`] Do not remove parens for tuples with starred expressions in
Python <=3.10 (`RUF031`)
([#&#8203;12784](https://togithub.com/astral-sh/ruff/pull/12784))
- Evaluate default parameter values for a function in that function's
enclosing scope
([#&#8203;12852](https://togithub.com/astral-sh/ruff/pull/12852))

##### Other changes

- Respect VS Code cell metadata when detecting the language of Jupyter
Notebook cells
([#&#8203;12864](https://togithub.com/astral-sh/ruff/pull/12864))
- Respect `kernelspec` notebook metadata when detecting the preferred
language for a Jupyter Notebook
([#&#8203;12875](https://togithub.com/astral-sh/ruff/pull/12875))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4yNi4xIiwidXBkYXRlZEluVmVyIjoiMzguMjYuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-19 02:28:22 +02:00
renovate[bot]
e19647a2bb
chore(deps): update dependency ruff to v0.5.7 (#755)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [ruff](https://docs.astral.sh/ruff)
([source](https://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `0.5.6` -> `0.5.7` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.5.7?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.5.7?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.5.6/0.5.7?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.5.6/0.5.7?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.5.7`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#057)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/0.5.6...0.5.7)

##### Preview features

- \[`flake8-comprehensions`] Account for list and set comprehensions in
`unnecessary-literal-within-tuple-call` (`C409`)
([#&#8203;12657](https://togithub.com/astral-sh/ruff/pull/12657))
- \[`flake8-pyi`] Add autofix for `future-annotations-in-stub`
(`PYI044`)
([#&#8203;12676](https://togithub.com/astral-sh/ruff/pull/12676))
- \[`flake8-return`] Avoid syntax error when auto-fixing `RET505` with
mixed indentation (space and tabs)
([#&#8203;12740](https://togithub.com/astral-sh/ruff/pull/12740))
- \[`pydoclint`] Add `docstring-missing-yields` (`DOC402`) and
`docstring-extraneous-yields` (`DOC403`)
([#&#8203;12538](https://togithub.com/astral-sh/ruff/pull/12538))
- \[`pydoclint`] Avoid `DOC201` if docstring begins with "Return",
"Returns", "Yield", or "Yields"
([#&#8203;12675](https://togithub.com/astral-sh/ruff/pull/12675))
- \[`pydoclint`] Deduplicate collected exceptions after traversing
function bodies (`DOC501`)
([#&#8203;12642](https://togithub.com/astral-sh/ruff/pull/12642))
- \[`pydoclint`] Ignore `DOC` errors for stub functions
([#&#8203;12651](https://togithub.com/astral-sh/ruff/pull/12651))
- \[`pydoclint`] Teach rules to understand reraised exceptions as being
explicitly raised (`DOC501`, `DOC502`)
([#&#8203;12639](https://togithub.com/astral-sh/ruff/pull/12639))
- \[`ruff`] Implement `incorrectly-parenthesized-tuple-in-subscript`
(`RUF031`)
([#&#8203;12480](https://togithub.com/astral-sh/ruff/pull/12480))
- \[`ruff`] Mark `RUF023` fix as unsafe if `__slots__` is not a set and
the binding is used elsewhere
([#&#8203;12692](https://togithub.com/astral-sh/ruff/pull/12692))

##### Rule changes

- \[`refurb`] Add autofix for `implicit-cwd` (`FURB177`)
([#&#8203;12708](https://togithub.com/astral-sh/ruff/pull/12708))
- \[`ruff`] Add autofix for `zip-instead-of-pairwise` (`RUF007`)
([#&#8203;12663](https://togithub.com/astral-sh/ruff/pull/12663))
- \[`tryceratops`] Add `BaseException` to `raise-vanilla-class` rule
(`TRY002`)
([#&#8203;12620](https://togithub.com/astral-sh/ruff/pull/12620))

##### Server

- Ignore non-file workspace URL; Ruff will display a warning
notification in this case
([#&#8203;12725](https://togithub.com/astral-sh/ruff/pull/12725))

##### CLI

- Fix cache invalidation for nested `pyproject.toml` files
([#&#8203;12727](https://togithub.com/astral-sh/ruff/pull/12727))

##### Bug fixes

- \[`flake8-async`] Fix false positives with multiple `async with` items
(`ASYNC100`)
([#&#8203;12643](https://togithub.com/astral-sh/ruff/pull/12643))
- \[`flake8-bandit`] Avoid false-positives for list concatenations in
SQL construction (`S608`)
([#&#8203;12720](https://togithub.com/astral-sh/ruff/pull/12720))
- \[`flake8-bugbear`] Treat `return` as equivalent to `break` (`B909`)
([#&#8203;12646](https://togithub.com/astral-sh/ruff/pull/12646))
- \[`flake8-comprehensions`] Set comprehensions not a violation for
`sum` in `unnecessary-comprehension-in-call` (`C419`)
([#&#8203;12691](https://togithub.com/astral-sh/ruff/pull/12691))
- \[`flake8-simplify`] Parenthesize conditions based on precedence when
merging if arms (`SIM114`)
([#&#8203;12737](https://togithub.com/astral-sh/ruff/pull/12737))
- \[`pydoclint`] Try both 'Raises' section styles when convention is
unspecified (`DOC501`)
([#&#8203;12649](https://togithub.com/astral-sh/ruff/pull/12649))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4yMC4xIiwidXBkYXRlZEluVmVyIjoiMzguMjAuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-12 04:49:49 +02:00
renovate[bot]
b41437d899
chore(docker): update python:3.12-alpine docker digest to c2f41e6 (#754)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `d25c94a` -> `c2f41e6` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4yMC4xIiwidXBkYXRlZEluVmVyIjoiMzguMjAuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-09 04:40:24 +02:00
renovate[bot]
d086671ebf
chore(docker): update python:3.12-alpine docker digest to d25c94a (#753)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `63094ab` -> `d25c94a` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4yMC4xIiwidXBkYXRlZEluVmVyIjoiMzguMjAuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-08 02:28:49 +02:00
10ea90ae99
ci: fix notification step 2024-08-07 21:26:43 +02:00
renovate[bot]
5359e86b9c
chore(docker): update python:3.12-alpine docker digest to 63094ab (#752)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `a0c22d8` -> `63094ab` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40NDAuNyIsInVwZGF0ZWRJblZlciI6IjM3LjQ0MC43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-06 04:03:52 +02:00
renovate[bot]
09a5bb097f
chore(deps): update dependency ruff to v0.5.6 (#751)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [ruff](https://docs.astral.sh/ruff)
([source](https://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `0.5.5` -> `0.5.6` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.5.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.5.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.5.5/0.5.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.5.5/0.5.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.5.6`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#056)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/0.5.5...0.5.6)

Ruff 0.5.6 automatically enables linting and formatting of notebooks in
*preview mode*.
You can opt-out of this behavior by adding `*.ipynb` to the
`extend-exclude` setting.

```toml
[tool.ruff]
extend-exclude = ["*.ipynb"]
```

##### Preview features

- Enable notebooks by default in preview mode
([#&#8203;12621](https://togithub.com/astral-sh/ruff/pull/12621))
- \[`flake8-builtins`] Implement import, lambda, and module shadowing
([#&#8203;12546](https://togithub.com/astral-sh/ruff/pull/12546))
- \[`pydoclint`] Add `docstring-missing-returns` (`DOC201`) and
`docstring-extraneous-returns` (`DOC202`)
([#&#8203;12485](https://togithub.com/astral-sh/ruff/pull/12485))

##### Rule changes

- \[`flake8-return`] Exempt cached properties and other property-like
decorators from explicit return rule (`RET501`)
([#&#8203;12563](https://togithub.com/astral-sh/ruff/pull/12563))

##### Server

- Make server panic hook more error resilient
([#&#8203;12610](https://togithub.com/astral-sh/ruff/pull/12610))
- Use `$/logTrace` for server trace logs in Zed and VS Code
([#&#8203;12564](https://togithub.com/astral-sh/ruff/pull/12564))
- Keep track of deleted cells for reorder change request
([#&#8203;12575](https://togithub.com/astral-sh/ruff/pull/12575))

##### Configuration

- \[`flake8-implicit-str-concat`] Always allow explicit multi-line
concatenations when implicit concatenations are banned
([#&#8203;12532](https://togithub.com/astral-sh/ruff/pull/12532))

##### Bug fixes

- \[`flake8-async`] Avoid flagging `asyncio.timeout`s as unused when the
context manager includes `asyncio.TaskGroup`
([#&#8203;12605](https://togithub.com/astral-sh/ruff/pull/12605))
- \[`flake8-slots`] Avoid recommending `__slots__` for classes that
inherit from more than `namedtuple`
([#&#8203;12531](https://togithub.com/astral-sh/ruff/pull/12531))
- \[`isort`] Avoid marking required imports as unused
([#&#8203;12537](https://togithub.com/astral-sh/ruff/pull/12537))
- \[`isort`] Preserve trailing inline comments on import-from statements
([#&#8203;12498](https://togithub.com/astral-sh/ruff/pull/12498))
- \[`pycodestyle`] Add newlines before comments (`E305`)
([#&#8203;12606](https://togithub.com/astral-sh/ruff/pull/12606))
- \[`pycodestyle`] Don't attach comments with mismatched indents
([#&#8203;12604](https://togithub.com/astral-sh/ruff/pull/12604))
- \[`pyflakes`] Fix preview-mode bugs in `F401` when attempting to
autofix unused first-party submodule imports in an `__init__.py` file
([#&#8203;12569](https://togithub.com/astral-sh/ruff/pull/12569))
- \[`pylint`] Respect start index in `unnecessary-list-index-lookup`
([#&#8203;12603](https://togithub.com/astral-sh/ruff/pull/12603))
- \[`pyupgrade`] Avoid recommending no-argument super in `slots=True`
dataclasses
([#&#8203;12530](https://togithub.com/astral-sh/ruff/pull/12530))
- \[`pyupgrade`] Use colon rather than dot formatting for integer-only
types ([#&#8203;12534](https://togithub.com/astral-sh/ruff/pull/12534))
- Fix NFKC normalization bug when removing unused imports
([#&#8203;12571](https://togithub.com/astral-sh/ruff/pull/12571))

##### Other changes

- Consider more stdlib decorators to be property-like
([#&#8203;12583](https://togithub.com/astral-sh/ruff/pull/12583))
- Improve handling of metaclasses in various linter rules
([#&#8203;12579](https://togithub.com/astral-sh/ruff/pull/12579))
- Improve consistency between linter rules in determining whether a
function is property
([#&#8203;12581](https://togithub.com/astral-sh/ruff/pull/12581))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40NDAuNyIsInVwZGF0ZWRJblZlciI6IjM3LjQ0MC43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-05 04:15:24 +02:00
renovate[bot]
3553457c40
chore(docker): update python:3.12-alpine docker digest to a0c22d8 (#750)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `2abecb7` -> `a0c22d8` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40NDAuNyIsInVwZGF0ZWRJblZlciI6IjM3LjQ0MC43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-03 02:19:07 +02:00
renovate[bot]
1f911b5b98
chore(docker): update python:3.12-alpine docker digest to 2abecb7 (#749)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `7b76f1c` -> `2abecb7` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40NDAuNyIsInVwZGF0ZWRJblZlciI6IjM3LjQ0MC43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-02 06:03:32 +02:00
renovate[bot]
bf1d4ce553
chore(docker): update python:3.12-alpine docker digest to 7b76f1c (#748)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `7f15e22` -> `7b76f1c` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40NDAuNyIsInVwZGF0ZWRJblZlciI6IjM3LjQ0MC43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-02 03:20:10 +02:00
renovate[bot]
e4b69969a4
chore(deps): update devdeps non-major (#747)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [pytest](https://togithub.com/pytest-dev/pytest)
([changelog](https://docs.pytest.org/en/stable/changelog.html)) |
`8.3.1` -> `8.3.2` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/pytest/8.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pytest/8.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pytest/8.3.1/8.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pytest/8.3.1/8.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [ruff](https://docs.astral.sh/ruff)
([source](https://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `0.5.4` -> `0.5.5` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.5.4/0.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.5.4/0.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>pytest-dev/pytest (pytest)</summary>

###
[`v8.3.2`](https://togithub.com/pytest-dev/pytest/releases/tag/8.3.2)

[Compare
Source](https://togithub.com/pytest-dev/pytest/compare/8.3.1...8.3.2)

# pytest 8.3.2 (2024-07-24)

## Bug fixes

- [#&#8203;12652](https://togithub.com/pytest-dev/pytest/issues/12652):
Resolve regression \[conda]{.title-ref} environments where no longer
being automatically detected.

    \-- by `RonnyPfannschmidt`{.interpreted-text role="user"}

</details>

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.5.5`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#055)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/0.5.4...0.5.5)

##### Preview features

- \[`fastapi`] Implement `fastapi-redundant-response-model` (`FAST001`)
and `fastapi-non-annotated-dependency`(`FAST002`)
([#&#8203;11579](https://togithub.com/astral-sh/ruff/pull/11579))
- \[`pydoclint`] Implement `docstring-missing-exception` (`DOC501`) and
`docstring-extraneous-exception` (`DOC502`)
([#&#8203;11471](https://togithub.com/astral-sh/ruff/pull/11471))

##### Rule changes

- \[`numpy`] Fix NumPy 2.0 rule for `np.alltrue` and `np.sometrue`
([#&#8203;12473](https://togithub.com/astral-sh/ruff/pull/12473))
- \[`numpy`] Ignore `NPY201` inside `except` blocks for compatibility
with older numpy versions
([#&#8203;12490](https://togithub.com/astral-sh/ruff/pull/12490))
- \[`pep8-naming`] Avoid applying `ignore-names` to `self` and `cls`
function names (`N804`, `N805`)
([#&#8203;12497](https://togithub.com/astral-sh/ruff/pull/12497))

##### Formatter

- Fix incorrect placement of leading function comment with type params
([#&#8203;12447](https://togithub.com/astral-sh/ruff/pull/12447))

##### Server

- Do not bail code action resolution when a quick fix is requested
([#&#8203;12462](https://togithub.com/astral-sh/ruff/pull/12462))

##### Bug fixes

- Fix `Ord` implementation of `cmp_fix`
([#&#8203;12471](https://togithub.com/astral-sh/ruff/pull/12471))
- Raise syntax error for unparenthesized generator expression in
multi-argument call
([#&#8203;12445](https://togithub.com/astral-sh/ruff/pull/12445))
- \[`pydoclint`] Fix panic in `DOC501` reported in
[#&#8203;12428](https://togithub.com/astral-sh/ruff/pull/12428)
([#&#8203;12435](https://togithub.com/astral-sh/ruff/pull/12435))
- \[`flake8-bugbear`] Allow singleton tuples with starred expressions in
`B013` ([#&#8203;12484](https://togithub.com/astral-sh/ruff/pull/12484))

##### Documentation

- Add Eglot setup guide for Emacs editor
([#&#8203;12426](https://togithub.com/astral-sh/ruff/pull/12426))
- Add note about the breaking change in `nvim-lspconfig`
([#&#8203;12507](https://togithub.com/astral-sh/ruff/pull/12507))
- Add note to include notebook files for native server
([#&#8203;12449](https://togithub.com/astral-sh/ruff/pull/12449))
- Add setup docs for Zed editor
([#&#8203;12501](https://togithub.com/astral-sh/ruff/pull/12501))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config help](https://togithub.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40NDAuNyIsInVwZGF0ZWRJblZlciI6IjM3LjQ0MC43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-29 04:38:35 +02:00
renovate[bot]
3ba3258643
chore(docker): update python:3.12-alpine docker digest to 7f15e22 (#746)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `0032125` -> `7f15e22` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MzguMCIsInVwZGF0ZWRJblZlciI6IjM3LjQzOC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-25 03:48:46 +02:00
renovate[bot]
b8850ef087
chore(docker): update python:3.12-alpine docker digest to 0032125 (#745)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `dbb264b` -> `0032125` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MzguMCIsInVwZGF0ZWRJblZlciI6IjM3LjQzOC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-24 03:19:22 +02:00
renovate[bot]
5d399c1f2d
chore(docker): update python:3.12-alpine docker digest to dbb264b (#744)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `0bd77ae` -> `dbb264b` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MzguMCIsInVwZGF0ZWRJblZlciI6IjM3LjQzOC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-23 04:15:07 +02:00
renovate[bot]
48c70735fd
fix(deps): update dependency dynaconf to v3.2.6 (#741)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-22 10:09:42 +02:00
renovate[bot]
66b216f64a
chore(deps): update devdeps non-major (#742)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [pytest](https://togithub.com/pytest-dev/pytest)
([changelog](https://docs.pytest.org/en/stable/changelog.html)) |
`8.2.2` -> `8.3.1` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/pytest/8.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pytest/8.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pytest/8.2.2/8.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pytest/8.2.2/8.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [ruff](https://docs.astral.sh/ruff)
([source](https://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `0.5.2` -> `0.5.4` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.5.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.5.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.5.2/0.5.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.5.2/0.5.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>pytest-dev/pytest (pytest)</summary>

###
[`v8.3.1`](https://togithub.com/pytest-dev/pytest/releases/tag/8.3.1)

[Compare
Source](https://togithub.com/pytest-dev/pytest/compare/8.3.0...8.3.1)

# pytest 8.3.1 (2024-07-20)

The 8.3.0 release failed to include the change notes and docs for the
release. This patch release remedies this. There are no other changes.

###
[`v8.3.0`](https://togithub.com/pytest-dev/pytest/compare/8.2.2...8.3.0)

[Compare
Source](https://togithub.com/pytest-dev/pytest/compare/8.2.2...8.3.0)

</details>

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.5.4`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#054)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/0.5.3...0.5.4)

##### Rule changes

- \[`ruff`] Rename `RUF007` to `zip-instead-of-pairwise`
([#&#8203;12399](https://togithub.com/astral-sh/ruff/pull/12399))

##### Bug fixes

- \[`flake8-builtins`] Avoid shadowing diagnostics for `@override`
methods
([#&#8203;12415](https://togithub.com/astral-sh/ruff/pull/12415))
- \[`flake8-comprehensions`] Insert parentheses for multi-argument
generators
([#&#8203;12422](https://togithub.com/astral-sh/ruff/pull/12422))
- \[`pydocstyle`] Handle escaped docstrings within docstring (`D301`)
([#&#8203;12192](https://togithub.com/astral-sh/ruff/pull/12192))

##### Documentation

- Fix GitHub link to Neovim setup
([#&#8203;12410](https://togithub.com/astral-sh/ruff/pull/12410))
- Fix `output-format` default in settings reference
([#&#8203;12409](https://togithub.com/astral-sh/ruff/pull/12409))

###
[`v0.5.3`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#053)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/0.5.2...0.5.3)

**Ruff 0.5.3 marks the stable release of the Ruff language server and
introduces revamped
[documentation](https://docs.astral.sh/ruff/editors), including [setup
guides for your editor of
choice](https://docs.astral.sh/ruff/editors/setup) and [the language
server
itself](https://docs.astral.sh/ruff/editors/settings)**.

##### Preview features

- Formatter: Insert empty line between suite and alternative branch
after function/class definition
([#&#8203;12294](https://togithub.com/astral-sh/ruff/pull/12294))
- \[`pyupgrade`] Implement `unnecessary-default-type-args` (`UP043`)
([#&#8203;12371](https://togithub.com/astral-sh/ruff/pull/12371))

##### Rule changes

- \[`flake8-bugbear`] Detect enumerate iterations in
`loop-iterator-mutation` (`B909`)
([#&#8203;12366](https://togithub.com/astral-sh/ruff/pull/12366))
- \[`flake8-bugbear`] Remove `discard`, `remove`, and `pop` allowance
for `loop-iterator-mutation` (`B909`)
([#&#8203;12365](https://togithub.com/astral-sh/ruff/pull/12365))
- \[`pylint`] Allow `repeated-equality-comparison` for mixed operations
(`PLR1714`)
([#&#8203;12369](https://togithub.com/astral-sh/ruff/pull/12369))
- \[`pylint`] Ignore `self` and `cls` when counting arguments
(`PLR0913`)
([#&#8203;12367](https://togithub.com/astral-sh/ruff/pull/12367))
- \[`pylint`] Use UTF-8 as default encoding in `unspecified-encoding`
fix (`PLW1514`)
([#&#8203;12370](https://togithub.com/astral-sh/ruff/pull/12370))

##### Server

- Build settings index in parallel for the native server
([#&#8203;12299](https://togithub.com/astral-sh/ruff/pull/12299))
- Use fallback settings when indexing the project
([#&#8203;12362](https://togithub.com/astral-sh/ruff/pull/12362))
- Consider `--preview` flag for `server` subcommand for the linter and
formatter
([#&#8203;12208](https://togithub.com/astral-sh/ruff/pull/12208))

##### Bug fixes

- \[`flake8-comprehensions`] Allow additional arguments for `sum` and
`max` comprehensions (`C419`)
([#&#8203;12364](https://togithub.com/astral-sh/ruff/pull/12364))
- \[`pylint`] Avoid dropping extra boolean operations in
`repeated-equality-comparison` (`PLR1714`)
([#&#8203;12368](https://togithub.com/astral-sh/ruff/pull/12368))
- \[`pylint`] Consider expression before statement when determining
binding kind (`PLR1704`)
([#&#8203;12346](https://togithub.com/astral-sh/ruff/pull/12346))

##### Documentation

- Add docs for Ruff language server
([#&#8203;12344](https://togithub.com/astral-sh/ruff/pull/12344))
- Migrate to standalone docs repo
([#&#8203;12341](https://togithub.com/astral-sh/ruff/pull/12341))
- Update versioning policy for editor integration
([#&#8203;12375](https://togithub.com/astral-sh/ruff/pull/12375))

##### Other changes

- Publish Wasm API to npm
([#&#8203;12317](https://togithub.com/astral-sh/ruff/pull/12317))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config help](https://togithub.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MzguMCIsInVwZGF0ZWRJblZlciI6IjM3LjQzOC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-22 03:08:24 +02:00
renovate[bot]
266e94748f
fix(deps): update dependency structlog to v24.4.0 (#740)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-18 10:27:23 +02:00
renovate[bot]
effa7873b8
chore(deps): update dependency ruff to v0.5.2 (#736)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [ruff](https://docs.astral.sh/ruff)
([source](https://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `0.5.1` -> `0.5.2` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.5.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.5.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.5.1/0.5.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.5.1/0.5.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.5.2`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#052)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/0.5.1...0.5.2)

##### Preview features

- Use `space` separator before parenthesized expressions in
comprehensions with leading comments
([#&#8203;12282](https://togithub.com/astral-sh/ruff/pull/12282))
- \[`flake8-async`] Update `ASYNC100` to include `anyio` and `asyncio`
([#&#8203;12221](https://togithub.com/astral-sh/ruff/pull/12221))
- \[`flake8-async`] Update `ASYNC109` to include `anyio` and `asyncio`
([#&#8203;12236](https://togithub.com/astral-sh/ruff/pull/12236))
- \[`flake8-async`] Update `ASYNC110` to include `anyio` and `asyncio`
([#&#8203;12261](https://togithub.com/astral-sh/ruff/pull/12261))
- \[`flake8-async`] Update `ASYNC115` to include `anyio` and `asyncio`
([#&#8203;12262](https://togithub.com/astral-sh/ruff/pull/12262))
- \[`flake8-async`] Update `ASYNC116` to include `anyio` and `asyncio`
([#&#8203;12266](https://togithub.com/astral-sh/ruff/pull/12266))

##### Rule changes

- \[`flake8-return`] Exempt properties from explicit return rule
(`RET501`)
([#&#8203;12243](https://togithub.com/astral-sh/ruff/pull/12243))
- \[`numpy`] Add `np.NAN`-to-`np.nan` diagnostic
([#&#8203;12292](https://togithub.com/astral-sh/ruff/pull/12292))
- \[`refurb`] Make `list-reverse-copy` an unsafe fix
([#&#8203;12303](https://togithub.com/astral-sh/ruff/pull/12303))

##### Server

- Consider `include` and `extend-include` settings in native server
([#&#8203;12252](https://togithub.com/astral-sh/ruff/pull/12252))
- Include nested configurations in settings reloading
([#&#8203;12253](https://togithub.com/astral-sh/ruff/pull/12253))

##### CLI

- Omit code frames for fixes with empty ranges
([#&#8203;12304](https://togithub.com/astral-sh/ruff/pull/12304))
- Warn about formatter incompatibility for `D203`
([#&#8203;12238](https://togithub.com/astral-sh/ruff/pull/12238))

##### Bug fixes

- Make cache-write failures non-fatal on Windows
([#&#8203;12302](https://togithub.com/astral-sh/ruff/pull/12302))
- Treat `not` operations as boolean tests
([#&#8203;12301](https://togithub.com/astral-sh/ruff/pull/12301))
- \[`flake8-bandit`] Avoid `S310` violations for HTTP-safe f-strings
([#&#8203;12305](https://togithub.com/astral-sh/ruff/pull/12305))
- \[`flake8-bandit`] Support explicit string concatenations in S310 HTTP
detection
([#&#8203;12315](https://togithub.com/astral-sh/ruff/pull/12315))
- \[`flake8-bandit`] fix S113 false positive for httpx without `timeout`
argument
([#&#8203;12213](https://togithub.com/astral-sh/ruff/pull/12213))
- \[`pycodestyle`] Remove "non-obvious" allowance for E721
([#&#8203;12300](https://togithub.com/astral-sh/ruff/pull/12300))
- \[`pyflakes`] Consider `with` blocks as single-item branches for
redefinition analysis
([#&#8203;12311](https://togithub.com/astral-sh/ruff/pull/12311))
- \[`refurb`] Restrict forwarding for `newline` argument in `open()`
calls to Python versions >= 3.10
([#&#8203;12244](https://togithub.com/astral-sh/ruff/pull/12244))

##### Documentation

- Update help and documentation to reflect `--output-format full`
default
([#&#8203;12248](https://togithub.com/astral-sh/ruff/pull/12248))

##### Performance

- Use more threads when discovering Python files
([#&#8203;12258](https://togithub.com/astral-sh/ruff/pull/12258))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MzEuNCIsInVwZGF0ZWRJblZlciI6IjM3LjQzMS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-15 03:21:18 +02:00
renovate[bot]
4a2825b06d
chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.47.0 (#737)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
|
[thegeeklab/hugo-geekdoc](https://togithub.com/thegeeklab/hugo-geekdoc)
| minor | `v0.46.0` -> `v0.47.0` |

---

### Release Notes

<details>
<summary>thegeeklab/hugo-geekdoc (thegeeklab/hugo-geekdoc)</summary>

###
[`v0.47.0`](https://togithub.com/thegeeklab/hugo-geekdoc/releases/tag/v0.47.0)

[Compare
Source](https://togithub.com/thegeeklab/hugo-geekdoc/compare/v0.46.0...v0.47.0)

##### v0.47.0 (2024-07-08)

##### Features

- add oc language support
([#&#8203;846](https://togithub.com/thegeeklab/hugo-geekdoc/issues/846))
([`fbf400d`](https://togithub.com/thegeeklab/hugo-geekdoc/commit/fbf400d))

##### Bug Fixes

- **deps:** update dependency katex to v0.16.11
([#&#8203;848](https://togithub.com/thegeeklab/hugo-geekdoc/issues/848))
([`e74233b`](https://togithub.com/thegeeklab/hugo-geekdoc/commit/e74233b))
- **deps:** update dependency uuid to v10
([#&#8203;841](https://togithub.com/thegeeklab/hugo-geekdoc/issues/841))
([`4e81167`](https://togithub.com/thegeeklab/hugo-geekdoc/commit/4e81167))

##### Others

- **deps:** lock file maintenance
([#&#8203;845](https://togithub.com/thegeeklab/hugo-geekdoc/issues/845))
([`fab5fdf`](https://togithub.com/thegeeklab/hugo-geekdoc/commit/fab5fdf))
- **deps:** update dependency npm-run-all2 to v6.2.2
([`a3860e9`](https://togithub.com/thegeeklab/hugo-geekdoc/commit/a3860e9))
- **deps:** update devdeps non-major
([`72c74a0`](https://togithub.com/thegeeklab/hugo-geekdoc/commit/72c74a0))
- **deps:** update devdeps non-major
([`25c7954`](https://togithub.com/thegeeklab/hugo-geekdoc/commit/25c7954))
- **deps:** lock file maintenance
([#&#8203;843](https://togithub.com/thegeeklab/hugo-geekdoc/issues/843))
([`6c51caf`](https://togithub.com/thegeeklab/hugo-geekdoc/commit/6c51caf))
- **deps:** update quay.io/thegeeklab/hugo docker tag to v0.127.0
([#&#8203;840](https://togithub.com/thegeeklab/hugo-geekdoc/issues/840))
([`5b6c182`](https://togithub.com/thegeeklab/hugo-geekdoc/commit/5b6c182))
- **deps:** update devdeps non-major
([`521b326`](https://togithub.com/thegeeklab/hugo-geekdoc/commit/521b326))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MzEuNCIsInVwZGF0ZWRJblZlciI6IjM3LjQzMS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-15 03:20:50 +02:00
renovate[bot]
c9066fe6be
chore(docker): update python:3.12-alpine docker digest to 0bd77ae (#735)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `29d92b7` -> `0bd77ae` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MjUuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQyNS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-11 05:51:52 +02:00
renovate[bot]
0661b4d3f4
chore(docker): update python:3.12-alpine docker digest to 29d92b7 (#734)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `b7662fc` -> `29d92b7` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MjUuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQyNS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-11 02:19:06 +02:00
renovate[bot]
b34bbda0fe
chore(deps): update quay.io/thegeeklab/wp-docker-buildx docker tag to v5 (#733)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-08 21:52:04 +02:00
renovate[bot]
deb73e641d
chore(deps): lock file maintenance (#728)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Update | Change |
|---|---|
| lockFileMaintenance | All locks refreshed |

🔧 This Pull Request updates lock files to use the latest dependency
versions.

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config help](https://togithub.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MTMuMiIsInVwZGF0ZWRJblZlciI6IjM3LjQxMy4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-08 09:10:36 +02:00
renovate[bot]
3581a38cc5
chore(deps): update dependency ruff to v0.5.1 (#732)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [ruff](https://docs.astral.sh/ruff)
([source](https://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `0.5.0` -> `0.5.1` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.5.0/0.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.5.0/0.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.5.1`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#051)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/0.5.0...0.5.1)

##### Preview features

- \[`flake8-bugbear`] Implement mutable-contextvar-default (B039)
([#&#8203;12113](https://togithub.com/astral-sh/ruff/pull/12113))
- \[`pycodestyle`] Whitespace after decorator (`E204`)
([#&#8203;12140](https://togithub.com/astral-sh/ruff/pull/12140))
- \[`pytest`] Reverse `PT001` and `PT0023` defaults
([#&#8203;12106](https://togithub.com/astral-sh/ruff/pull/12106))

##### Rule changes

- Enable token-based rules on source with syntax errors
([#&#8203;11950](https://togithub.com/astral-sh/ruff/pull/11950))
- \[`flake8-bandit`] Detect `httpx` for `S113`
([#&#8203;12174](https://togithub.com/astral-sh/ruff/pull/12174))
- \[`numpy`] Update `NPY201` to include exception deprecations
([#&#8203;12065](https://togithub.com/astral-sh/ruff/pull/12065))
- \[`pylint`] Generate autofix for `duplicate-bases` (`PLE0241`)
([#&#8203;12105](https://togithub.com/astral-sh/ruff/pull/12105))

##### Server

- Avoid syntax error notification for source code actions
([#&#8203;12148](https://togithub.com/astral-sh/ruff/pull/12148))
- Consider the content of the new cells during notebook sync
([#&#8203;12203](https://togithub.com/astral-sh/ruff/pull/12203))
- Fix replacement edit range computation
([#&#8203;12171](https://togithub.com/astral-sh/ruff/pull/12171))

##### Bug fixes

- Disable auto-fix when source has syntax errors
([#&#8203;12134](https://togithub.com/astral-sh/ruff/pull/12134))
- Fix cache key collisions for paths with separators
([#&#8203;12159](https://togithub.com/astral-sh/ruff/pull/12159))
- Make `requires-python` inference robust to `==`
([#&#8203;12091](https://togithub.com/astral-sh/ruff/pull/12091))
- Use char-wise width instead of `str`-width
([#&#8203;12135](https://togithub.com/astral-sh/ruff/pull/12135))
- \[`pycodestyle`] Avoid `E275` if keyword followed by comma
([#&#8203;12136](https://togithub.com/astral-sh/ruff/pull/12136))
- \[`pycodestyle`] Avoid `E275` if keyword is followed by a semicolon
([#&#8203;12095](https://togithub.com/astral-sh/ruff/pull/12095))
- \[`pylint`] Skip [dummy
variables](https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx)
for `PLR1704`
([#&#8203;12190](https://togithub.com/astral-sh/ruff/pull/12190))

##### Performance

- Remove allocation in `parse_identifier`
([#&#8203;12103](https://togithub.com/astral-sh/ruff/pull/12103))
- Use `CompactString` for `Identifier` AST node
([#&#8203;12101](https://togithub.com/astral-sh/ruff/pull/12101))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MjEuOSIsInVwZGF0ZWRJblZlciI6IjM3LjQyMS45IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-08 03:53:11 +02:00
renovate[bot]
fc44e52c23
chore(docker): update python:3.12-alpine docker digest to b7662fc (#731)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `ff870bf` -> `b7662fc` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MjEuOSIsInVwZGF0ZWRJblZlciI6IjM3LjQyMS45IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-04 03:30:11 +02:00
renovate[bot]
802085ae54
chore(deps): update dependency ruff to v0.5.0 (#730)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [ruff](https://docs.astral.sh/ruff)
([source](https://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `0.4.10` -> `0.5.0` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.4.10/0.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.4.10/0.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.5.0`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#050)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.4.10...0.5.0)

Check out the [blog post](https://astral.sh/blog/ruff-v0.5.0) for a
migration guide and overview of the changes!

##### Breaking changes

See also, the "Remapped rules" section which may result in disabled
rules.

- Follow the XDG specification to discover user-level configurations on
macOS (same as on other Unix platforms)
-   Selecting `ALL` now excludes deprecated rules
- The released archives now include an extra level of nesting, which can
be removed with `--strip-components=1` when untarring.
- The release artifact's file name no longer includes the version tag.
This enables users to install via `/latest` URLs on GitHub.

##### Deprecations

The following rules are now deprecated:

- [`syntax-error`](https://docs.astral.sh/ruff/rules/syntax-error/)
(`E999`): Syntax errors are now always shown

##### Remapped rules

The following rules have been remapped to new rule codes:

-
[`blocking-http-call-in-async-function`](https://docs.astral.sh/ruff/rules/blocking-http-call-in-async-function/):
`ASYNC100` to `ASYNC210`
-
[`open-sleep-or-subprocess-in-async-function`](https://docs.astral.sh/ruff/rules/open-sleep-or-subprocess-in-async-function/):
`ASYNC101` split into `ASYNC220`, `ASYNC221`, `ASYNC230`, and `ASYNC251`
-
[`blocking-os-call-in-async-function`](https://docs.astral.sh/ruff/rules/blocking-os-call-in-async-function/):
`ASYNC102` has been merged into `ASYNC220` and `ASYNC221`
-
[`trio-timeout-without-await`](https://docs.astral.sh/ruff/rules/trio-timeout-without-await/):
`TRIO100` to `ASYNC100`
- [`trio-sync-call`](https://docs.astral.sh/ruff/rules/trio-sync-call/):
`TRIO105` to `ASYNC105`
-
[`trio-async-function-with-timeout`](https://docs.astral.sh/ruff/rules/trio-async-function-with-timeout/):
`TRIO109` to `ASYNC109`
-
[`trio-unneeded-sleep`](https://docs.astral.sh/ruff/rules/trio-unneeded-sleep/):
`TRIO110` to `ASYNC110`
-
[`trio-zero-sleep-call`](https://docs.astral.sh/ruff/rules/trio-zero-sleep-call/):
`TRIO115` to `ASYNC115`
-
[`repeated-isinstance-calls`](https://docs.astral.sh/ruff/rules/repeated-isinstance-calls/):
`PLR1701` to `SIM101`

##### Stabilization

The following rules have been stabilized and are no longer in preview:

-
[`mutable-fromkeys-value`](https://docs.astral.sh/ruff/rules/mutable-fromkeys-value/)
(`RUF024`)
-
[`default-factory-kwarg`](https://docs.astral.sh/ruff/rules/default-factory-kwarg/)
(`RUF026`)
- [`django-extra`](https://docs.astral.sh/ruff/rules/django-extra/)
(`S610`)
-
[`manual-dict-comprehension`](https://docs.astral.sh/ruff/rules/manual-dict-comprehension/)
(`PERF403`)
-
[`print-empty-string`](https://docs.astral.sh/ruff/rules/print-empty-string/)
(`FURB105`)
-
[`readlines-in-for`](https://docs.astral.sh/ruff/rules/readlines-in-for/)
(`FURB129`)
-
[`if-expr-min-max`](https://docs.astral.sh/ruff/rules/if-expr-min-max/)
(`FURB136`)
- [`bit-count`](https://docs.astral.sh/ruff/rules/bit-count/)
(`FURB161`)
-
[`redundant-log-base`](https://docs.astral.sh/ruff/rules/redundant-log-base/)
(`FURB163`)
-
[`regex-flag-alias`](https://docs.astral.sh/ruff/rules/regex-flag-alias/)
(`FURB167`)
-
[`isinstance-type-none`](https://docs.astral.sh/ruff/rules/isinstance-type-none/)
(`FURB168`)
-
[`type-none-comparison`](https://docs.astral.sh/ruff/rules/type-none-comparison/)
(`FURB169`)
- [`implicit-cwd`](https://docs.astral.sh/ruff/rules/implicit-cwd/)
(`FURB177`)
-
[`hashlib-digest-hex`](https://docs.astral.sh/ruff/rules/hashlib-digest-hex/)
(`FURB181`)
-
[`list-reverse-copy`](https://docs.astral.sh/ruff/rules/list-reverse-copy/)
(`FURB187`)
- [`bad-open-mode`](https://docs.astral.sh/ruff/rules/bad-open-mode/)
(`PLW1501`)
- [`empty-comment`](https://docs.astral.sh/ruff/rules/empty-comment/)
(`PLR2044`)
-
[`global-at-module-level`](https://docs.astral.sh/ruff/rules/global-at-module-level/)
(`PLW0604`)
-
[`misplaced-bare-raise`](https://docs.astral.sh/ruff/rules/misplaced-bare-raise%60/)
(`PLE0744`)
-
[`non-ascii-import-name`](https://docs.astral.sh/ruff/rules/non-ascii-import-name/)
(`PLC2403`)
- [`non-ascii-name`](https://docs.astral.sh/ruff/rules/non-ascii-name/)
(`PLC2401`)
-
[`nonlocal-and-global`](https://docs.astral.sh/ruff/rules/nonlocal-and-global/)
(`PLE0115`)
-
[`potential-index-error`](https://docs.astral.sh/ruff/rules/potential-index-error/)
(`PLE0643`)
-
[`redeclared-assigned-name`](https://docs.astral.sh/ruff/rules/redeclared-assigned-name/)
(`PLW0128`)
-
[`redefined-argument-from-local`](https://docs.astral.sh/ruff/rules/redefined-argument-from-local/)
(`PLR1704`)
-
[`repeated-keyword-argument`](https://docs.astral.sh/ruff/rules/repeated-keyword-argument/)
(`PLE1132`)
-
[`super-without-brackets`](https://docs.astral.sh/ruff/rules/super-without-brackets/)
(`PLW0245`)
-
[`unnecessary-list-index-lookup`](https://docs.astral.sh/ruff/rules/unnecessary-list-index-lookup/)
(`PLR1736`)
-
[`useless-exception-statement`](https://docs.astral.sh/ruff/rules/useless-exception-statement/)
(`PLW0133`)
-
[`useless-with-lock`](https://docs.astral.sh/ruff/rules/useless-with-lock/)
(`PLW2101`)

The following behaviors have been stabilized:

- [`is-literal`](https://docs.astral.sh/ruff/rules/is-literal/) (`F632`)
now warns for identity checks against list, set or dictionary literals
- [`needless-bool`](https://docs.astral.sh/ruff/rules/needless-bool/)
(`SIM103`) now detects `if` expressions with implicit `else` branches
-
[`module-import-not-at-top-of-file`](https://docs.astral.sh/ruff/rules/module-import-not-at-top-of-file/)
(`E402`) now allows `os.environ` modifications between import statements
-
[`type-comparison`](https://docs.astral.sh/ruff/rules/type-comparison/)
(`E721`) now allows idioms such as `type(x) is int`
- [`yoda-condition`](https://docs.astral.sh/ruff/rules/yoda-conditions/)
(`SIM300`) now flags a wider range of expressions

##### Removals

The following deprecated settings have been removed:

- `output-format=text`; use `output-format=concise` or
`output-format=full`
-   `tab-size`; use `indent-width`

The following deprecated CLI options have been removed:

-   `--show-source`; use `--output-format=full`
-   `--no-show-source`; use `--output-format=concise`

The following deprecated CLI commands have been removed:

-   `ruff <path>`; use `ruff check <path>`
-   `ruff --clean`; use `ruff clean`
- `ruff --generate-shell-completion`; use `ruff
generate-shell-completion`

##### Preview features

- \[`ruff`] Add `assert-with-print-message` rule
([#&#8203;11981](https://togithub.com/astral-sh/ruff/pull/11981))

##### CLI

- Use rule name rather than message in `--statistics`
([#&#8203;11697](https://togithub.com/astral-sh/ruff/pull/11697))
- Use the output format `full` by default
([#&#8203;12010](https://togithub.com/astral-sh/ruff/pull/12010))
- Don't log syntax errors to the console
([#&#8203;11902](https://togithub.com/astral-sh/ruff/pull/11902))

##### Rule changes

- \[`ruff`] Fix false positives if `gettext` is imported using an alias
(`RUF027`)
([#&#8203;12025](https://togithub.com/astral-sh/ruff/pull/12025))
- \[`npy`] Update `trapz` and `in1d` deprecation (`NPY201`)
([#&#8203;11948](https://togithub.com/astral-sh/ruff/pull/11948))
- \[`flake8-bandit`] Modify diagnostic ranges for shell-related rules
([#&#8203;10667](https://togithub.com/astral-sh/ruff/pull/10667))

##### Server

- Closing an untitled, unsaved notebook document no longer throws an
error ([#&#8203;11942](https://togithub.com/astral-sh/ruff/pull/11942))
- Support the usage of tildes and environment variables in `logFile`
([#&#8203;11945](https://togithub.com/astral-sh/ruff/pull/11945))
- Add option to configure whether to show syntax errors
([#&#8203;12059](https://togithub.com/astral-sh/ruff/pull/12059))

##### Bug fixes

- \[`pycodestyle`] Avoid `E203` for f-string debug expression
([#&#8203;12024](https://togithub.com/astral-sh/ruff/pull/12024))
- \[`pep8-naming`] Match import-name ignores against both name and alias
(`N812`, `N817`)
([#&#8203;12033](https://togithub.com/astral-sh/ruff/pull/12033))
- \[`pyflakes`] Detect assignments that shadow definitions (`F811`)
([#&#8203;11961](https://togithub.com/astral-sh/ruff/pull/11961))

##### Parser

- Emit a syntax error for an empty type parameter list
([#&#8203;12030](https://togithub.com/astral-sh/ruff/pull/12030))
- Avoid consuming the newline for unterminated strings
([#&#8203;12067](https://togithub.com/astral-sh/ruff/pull/12067))
- Do not include the newline in the unterminated string range
([#&#8203;12017](https://togithub.com/astral-sh/ruff/pull/12017))
- Use the correct range to highlight line continuation errors
([#&#8203;12016](https://togithub.com/astral-sh/ruff/pull/12016))
- Consider 2-character EOL before line continuations
([#&#8203;12035](https://togithub.com/astral-sh/ruff/pull/12035))
- Consider line continuation character for re-lexing
([#&#8203;12008](https://togithub.com/astral-sh/ruff/pull/12008))

##### Other changes

- Upgrade the Unicode table used for measuring the line-length
([#&#8203;11194](https://togithub.com/astral-sh/ruff/pull/11194))
- Remove the deprecation error message for the nursery selector
([#&#8203;10172](https://togithub.com/astral-sh/ruff/pull/10172))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MjEuMCIsInVwZGF0ZWRJblZlciI6IjM3LjQyMS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-01 03:14:45 +02:00
renovate[bot]
434f79e9f2
chore(docker): update python:3.12-alpine docker digest to ff870bf (#729)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `dc09596` -> `ff870bf` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MjAuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-28 03:37:18 +02:00
renovate[bot]
8a027828bf
chore(deps): update dependency ruff to v0.4.10 (#727)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [ruff](https://docs.astral.sh/ruff)
([source](https://togithub.com/astral-sh/ruff),
[changelog](https://togithub.com/astral-sh/ruff/blob/main/CHANGELOG.md))
| `0.4.9` -> `0.4.10` |
[![age](https://developer.mend.io/api/mc/badges/age/pypi/ruff/0.4.10?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/ruff/0.4.10?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/ruff/0.4.9/0.4.10?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/ruff/0.4.9/0.4.10?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>astral-sh/ruff (ruff)</summary>

###
[`v0.4.10`](https://togithub.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0410)

[Compare
Source](https://togithub.com/astral-sh/ruff/compare/v0.4.9...v0.4.10)

##### Parser

- Implement re-lexing logic for better error recovery
([#&#8203;11845](https://togithub.com/astral-sh/ruff/pull/11845))

##### Rule changes

- \[`flake8-copyright`] Update `CPY001` to check the first 4096 bytes
instead of 1024
([#&#8203;11927](https://togithub.com/astral-sh/ruff/pull/11927))
- \[`pycodestyle`] Update `E999` to show all syntax errors instead of
just the first one
([#&#8203;11900](https://togithub.com/astral-sh/ruff/pull/11900))

##### Server

- Add tracing setup guide to Helix documentation
([#&#8203;11883](https://togithub.com/astral-sh/ruff/pull/11883))
- Add tracing setup guide to Neovim documentation
([#&#8203;11884](https://togithub.com/astral-sh/ruff/pull/11884))
- Defer notebook cell deletion to avoid an error message
([#&#8203;11864](https://togithub.com/astral-sh/ruff/pull/11864))

##### Security

- Guard against malicious ecosystem comment artifacts
([#&#8203;11879](https://togithub.com/astral-sh/ruff/pull/11879))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MTMuMiIsInVwZGF0ZWRJblZlciI6IjM3LjQxMy4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-24 02:37:34 +02:00
f1bd734498
fix: fix syntax issue in annotation parser (#725) 2024-06-22 20:49:16 +02:00
951f4394da
fix: add error handling for not existing base dir (#726) 2024-06-22 12:25:23 +02:00
renovate[bot]
41e5ec806b
chore(docker): update python:3.12-alpine docker digest to dc09596 (#724)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `15e5169` -> `dc09596` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MTMuMiIsInVwZGF0ZWRJblZlciI6IjM3LjQxMy4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-22 02:40:52 +02:00
renovate[bot]
65723bae22
chore(docker): update python:3.12-alpine docker digest to 15e5169 (#723)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| python | final | digest | `a982997` -> `15e5169` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/thegeeklab/ansible-doctor).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MTMuMiIsInVwZGF0ZWRJblZlciI6IjM3LjQxMy4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-21 03:30:18 +02:00
8e22e87a31
refactor: replace logger by structlog (#718)
BREAKING CHANGE: Replace the custom logger and `python-json-logger` with
`structlog`. This will also change the layout and general structure of
the log messages.

The original `python-json-logger` package is unmaintained and has caused
some issues. Using https://github.com/nhairs/python-json-logger.git
instead has fixed the logging issues but prevents PyPI package
uploads...

```
HTTP Error 400: Can't have direct dependency: python-json-logger@ git+https://github.com/nhairs/python-json-logger.git@v3.1.0. See https://packaging.python.org/specifications/core-metadata for more information.
```
2024-06-17 13:51:03 +02:00
renovate[bot]
ed113e37ea
chore(deps): lock file maintenance (#721)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-17 08:43:13 +02:00
renovate[bot]
c33738c8a1 chore(deps): update dependency ruff to v0.4.9 2024-06-17 03:15:24 +02:00
renovate[bot]
d5e4e6ba33 chore(docker): update python:3.12-alpine docker digest to a982997 2024-06-15 04:27:03 +02:00
08e2178333
feat: add option to load templates from remote git sources (#717) 2024-06-12 20:59:55 +02:00
renovate[bot]
42892daa74
chore(deps): lock file maintenance (#716)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-11 10:19:07 +02:00
renovate[bot]
ab6c988869
chore(deps): update quay.io/thegeeklab/hugo docker tag to v0.127.0 (#713)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-10 07:27:41 +02:00
renovate[bot]
eb2cf69468 chore(deps): update devdeps non-major 2024-06-10 06:05:31 +02:00
renovate[bot]
abee343056 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.46.0 2024-06-10 03:08:33 +02:00
renovate[bot]
29320b6b96 chore(docker): update python:3.12-alpine docker digest to d24ed56 2024-06-08 03:37:15 +02:00
8e042c739e
feat: migrate to dynaconf to handle multi-source configuration (#708) 2024-06-07 21:51:10 +02:00
9b20c11660
fix: exclude tags from exclude_tags during rendering (#711) 2024-06-07 21:30:10 +02:00
renovate[bot]
5760ee0832 chore(docker): update python:3.12-alpine docker digest to 32385e6 2024-06-06 03:51:22 +02:00
renovate[bot]
db94c07396
chore(deps): lock file maintenance (#707)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-05 09:26:04 +02:00
renovate[bot]
73bbd746d3 chore(deps): update dependency ruff to v0.4.7 2024-06-03 03:31:33 +02:00
ab0372bef5
chore: unifi jinja template syntax and add linting (#704) 2024-06-02 09:00:07 +02:00
3df7e465db
docs: add documentation for tabulated vars option (#705) 2024-06-02 00:08:33 +02:00
89c6a11be4
fix: fix sysexit with custom error (#703) 2024-06-02 00:08:25 +02:00
Chip Selden
4051d2915d
feat: add option for tabulating variables (#693) 2024-06-01 22:05:16 +02:00
renovate[bot]
fe4e4e5f7a
chore(deps): lock file maintenance (#702)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-01 13:18:57 +02:00
renovate[bot]
172e4f4380 chore(deps): update dependency ruff to v0.4.5 2024-05-27 04:31:24 +02:00
renovate[bot]
fada900568
fix(deps): update dependency ansible-core to v2.14.17 (#698)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-24 09:44:19 +02:00
renovate[bot]
013f760c8a chore(docker): update python:3.12-alpine docker digest to 5365725 2024-05-23 05:49:37 +02:00
renovate[bot]
00adc389a2 chore(deps): update dependency pytest to v8.2.1 2024-05-20 03:47:49 +02:00
renovate[bot]
84fdc06315
chore(deps): lock file maintenance (#695)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-15 11:06:23 +02:00
renovate[bot]
db68e80372
chore(deps): update quay.io/thegeeklab/hugo docker tag to v0.125.7 (#696)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-14 14:24:17 +02:00
renovate[bot]
af702628eb chore(deps): update dependency ruff to v0.4.4 2024-05-13 03:05:31 +02:00
renovate[bot]
81d4e97af6
fix(deps): update dependency jinja2 to v3.1.4 (#692)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-06 21:29:22 +02:00
renovate[bot]
a33f3c53bb chore(deps): update dependency ruff to v0.4.3 2024-05-06 02:37:46 +02:00
renovate[bot]
ccc2d249f8
fix(deps): update dependency jsonschema to v4.22.0 (#689)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-01 12:36:45 +02:00
renovate[bot]
f7ff5fd624
chore(deps): lock file maintenance (#683)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-29 10:28:49 +02:00
renovate[bot]
acee6e1285 chore(deps): update devdeps non-major 2024-04-29 04:15:22 +02:00
Julien Rottenberg
2375ad118d
fix: install extra group when using pre-commit (#687) 2024-04-24 08:54:48 +02:00
renovate[bot]
a2f02527d9
fix(deps): update dependency ansible-core to v2.14.16 (#686)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-23 21:18:13 +02:00
renovate[bot]
0bf59ac34f chore(deps): update dependency ruff to v0.4.1 2024-04-22 03:46:05 +02:00
renovate[bot]
94ec1a632b chore(deps): update dependency ruff to v0.3.7 2024-04-15 02:40:29 +02:00
renovate[bot]
075e1f91ca
fix(deps): update dependency ansible-core to v2.14.15 (#681)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-12 09:59:00 +02:00
4cf63bf2fe
separate minor-patch for ansible deps 2024-04-12 09:23:00 +02:00
renovate[bot]
e3f797d5e3
chore(deps): lock file maintenance (#677)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-12 09:18:07 +02:00
renovate[bot]
3a0c5ae35f chore(docker): update python:3.12-alpine docker digest to ef09762 2024-04-11 04:03:51 +02:00
renovate[bot]
9f7f943c93 chore(deps): update dependency ruff to v0.3.5 2024-04-08 03:24:24 +02:00
renovate[bot]
b38c4aa2b8 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.45.0 2024-04-08 03:24:09 +02:00
renovate[bot]
ed167d1443 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.44.3 2024-04-01 03:24:41 +02:00
renovate[bot]
da6fd26c6d
chore(deps): update quay.io/thegeeklab/wp-docker-buildx docker tag to v4 (#674)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-27 08:42:10 +01:00
renovate[bot]
522c21f8fc chore(docker): update python:3.12-alpine docker digest to c7eb5c9 2024-03-27 01:21:36 +01:00
renovate[bot]
28e39055e3
chore(deps): lock file maintenance (#669)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-26 21:39:41 +01:00
renovate[bot]
894965286b
chore(deps): update dependency pytest-cov to v5 (#671)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-25 08:34:20 +01:00
renovate[bot]
c2e0f787ce chore(deps): update devdeps non-major 2024-03-25 01:35:05 +01:00
renovate[bot]
d524537fd3
chore(deps): update quay.io/thegeeklab/hugo docker tag to v0.124.1 (#670)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-21 08:48:14 +01:00
renovate[bot]
a559b654ca chore(deps): update dependency ruff to v0.3.3 2024-03-18 03:00:26 +01:00
renovate[bot]
aa78adf912 chore(docker): update python:3.12-alpine docker digest to 25a82f6 2024-03-17 01:49:43 +01:00
6e88c18375
ci: fix deprecated ruff command 2024-03-12 20:52:52 +01:00
7b9ba09f1d fix linting 2024-03-11 09:44:16 +01:00
renovate[bot]
08883952c1 chore(deps): update devdeps non-major 2024-03-11 09:44:16 +01:00
renovate[bot]
e1ef4937dd chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.44.2 2024-03-11 02:43:51 +01:00
renovate[bot]
571222f6f5
chore(deps): lock file maintenance (#663)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-07 11:04:59 +01:00
renovate[bot]
6d50525021
fix(deps): update dependency environs to v11 (#664)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-07 11:04:46 +01:00
renovate[bot]
3ade4698e7 chore(deps): update devdeps non-major 2024-03-04 02:18:33 +01:00
renovate[bot]
ee81c8ee73
chore(deps): lock file maintenance (#659)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-26 10:26:11 +01:00
renovate[bot]
03df5bd79b
chore(deps): lock file maintenance (#657)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-26 10:14:18 +01:00
renovate[bot]
1e32a8f87a chore(deps): update dependency pytest to v8.0.2 2024-02-26 02:21:25 +01:00
renovate[bot]
dab9bc8691 chore(deps): update devdeps non-major 2024-02-19 02:20:31 +01:00
e2eaa81c4f
[skip ci] revert renovate automerge config 2024-02-15 12:23:07 +01:00
renovate[bot]
732f588aa9
chore(deps): update quay.io/thegeeklab/hugo docker tag to v0.122.0 (#655)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-11 16:53:09 +01:00
6619351fbd
enable renovate on automerge branches 2024-02-09 23:08:29 +01:00
renovate[bot]
8f6f444931 chore(docker): update python:3.12-alpine docker digest to 1a05012 2024-02-09 05:43:21 +01:00
renovate[bot]
49b861cabc
fix(deps): update dependency ruamel.yaml to v0.18.6 (#653)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-07 22:36:59 +01:00
renovate[bot]
59b497d745
fix(deps): update dependency ansible-core to v2.14.14 (#652)
This CVE does not affect ansible-doctor and is therefore not treated as a security update.

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-07 08:38:43 +01:00
b2f4fd2bd8
chore: bump ruff to v0.2.1 (#651) 2024-02-06 09:34:17 +01:00
renovate[bot]
864af95606
chore(deps): update dependency pytest to v8 (#648)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-31 09:05:49 +01:00
renovate[bot]
758c87ee80 chore(docker): update python:3.12-alpine docker digest to 14cfc61 2024-01-29 06:35:05 +01:00
renovate[bot]
9b0edda70a
chore(deps): update quay.io/thegeeklab/wp-docker-buildx docker tag to v3 (#647)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-22 11:27:39 +01:00
renovate[bot]
1d32f7548a chore(deps): update dependency ruff to v0.1.14 2024-01-22 02:14:07 +01:00
renovate[bot]
704cdb9d7c
fix(deps): update dependency jsonschema to v4.21.1 (#645)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-20 15:13:09 +01:00
renovate[bot]
c7f3fe57a0 chore(docker): update python:3.12-alpine docker digest to 801b54e 2024-01-19 23:32:46 +01:00
renovate[bot]
1270d7cb7d chore(docker): update python:3.12-alpine docker digest to 4a156f7 2024-01-19 05:23:41 +01:00
renovate[bot]
461eeb2d74 chore(docker): update python:3.12-alpine docker digest to 67990ec 2024-01-19 02:54:58 +01:00
renovate[bot]
0817646004
fix(deps): update dependency jsonschema to v4.21.0 (#641)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-18 10:21:51 +01:00
renovate[bot]
5242fd882a chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.44.1 2024-01-16 00:19:56 +01:00
renovate[bot]
052c668d92
fix(deps): update dependency anyconfig to v0.14.0 (#638)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-15 21:56:46 +01:00
1e8a8beef7 fix linting 2024-01-15 15:24:52 +01:00
renovate[bot]
c124460c11 chore(deps): update dependency ruff to v0.1.13 2024-01-15 15:24:52 +01:00
renovate[bot]
38bd53f7bc
fix(deps): update dependency environs to v10.3.0 (#637)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-12 08:30:19 +01:00
renovate[bot]
dbf9c979ac
fix(deps): update dependency jinja2 to v3.1.3 (#636)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-11 08:29:35 +01:00
renovate[bot]
fe12548387
fix(deps): update dependency ansible-core to v2.14.12 [security] (#633)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-10 10:09:14 +01:00
ae14704b74
chore: drop support for python 3.8 (#634)
BREAKING CHANGE: The support for python 3.8 was removed to bundle `ansible-core` v2.14.x by default.
2024-01-10 09:07:45 +01:00
renovate[bot]
2232a12bc8
fix(deps): update dependency environs to v10.2.0 (#632)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-10 08:48:16 +01:00
78d4c5f44b
fix: make ansible-core an optional extra-dependency (#631) 2024-01-10 08:32:57 +01:00
c3068a573f
re-generate poetry lockfile 2024-01-09 15:27:07 +01:00
danielpodwysocki
505f9b58cc
fix: allow ansible-core versions newer than 2.13
ansible-core 2.13 and the corresponding ansible 6.0.0 had been deprecated. This allows users to use ansible-doctor with any modern enough version of ansible, while not breaking legacy setups.
2024-01-09 15:19:10 +01:00
renovate[bot]
593df92d32
chore(deps): lock file maintenance (#618)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-09 15:17:43 +01:00
renovate[bot]
568b91654d
fix(deps): update dependency environs to v10.1.0 (#627)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-09 15:03:32 +01:00
renovate[bot]
4afabc4284 chore(deps): update dependency ruff to v0.1.11 2024-01-08 02:07:30 +01:00
renovate[bot]
10ff283ec2
chore(deps): update quay.io/thegeeklab/hugo docker tag to v0.121.2 (#625)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-07 20:42:02 +01:00
renovate[bot]
1d0ff92bf3 chore(deps): update dependency pytest to v7.4.4 2024-01-01 03:06:14 +01:00
renovate[bot]
7245a4149c
fix(deps): update dependency environs to v10 (#616)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-27 11:07:48 +01:00
renovate[bot]
df155dcf8a chore(deps): update dependency ruff to v0.1.9 2023-12-25 01:59:40 +01:00
2ce29b2bff
use exact package name match 2023-12-24 00:01:40 +01:00
1dc53d1970
disable renovate for python test matrix in ci 2023-12-23 23:40:38 +01:00
2f1f42318b
use list style synatx and cleanup (#619) 2023-12-23 23:24:56 +01:00
renovate[bot]
69d682df79 chore(deps): update dependency ruff to v0.1.8 2023-12-18 02:34:28 +01:00
223b1d8814
cleanup unused env vars in ci 2023-12-17 14:07:58 +01:00
renovate[bot]
70539cc9a2
chore(deps): lock file maintenance (#615)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-12 08:55:43 +01:00
renovate[bot]
982e2db2df
fix(deps): update dependency pathspec to v0.12.1 (#613)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-12 08:55:06 +01:00
renovate[bot]
787c09a741 chore(deps): update dependency ruff to v0.1.7 2023-12-11 02:16:03 +01:00
renovate[bot]
95c2a6aeaf chore(docker): update python:3.12-alpine docker digest to c793b92 2023-12-09 07:35:33 +01:00
renovate[bot]
855f48894a chore(docker): update python:3.12-alpine docker digest to 401aa10 2023-12-09 04:23:04 +01:00
2270051d0d
ci: exclude dockerhub from linkcheck due to rate limiting 2023-12-07 09:08:22 +01:00
renovate[bot]
c0f100b70e
chore(deps): update quay.io/thegeeklab/wp-docker-buildx docker tag to v2 (#610)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-07 08:40:11 +01:00
dependabot[bot]
41ed10270d
chore(deps): bump cryptography from 41.0.5 to 41.0.6 (#609)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-05 10:16:25 +01:00
renovate[bot]
eef09f4a42
chore(deps): lock file maintenance (#607)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-05 10:05:27 +01:00
renovate[bot]
0460f09627 chore(docker): update python:3.12-alpine docker digest to 09f18c1 2023-12-04 20:02:12 +00:00
6a7ae3011d
fix settings for required status checks 2023-12-04 21:01:49 +01:00
0db500b0a8
fix: replace log by message for yes/no prompt (#606) 2023-11-23 10:33:36 +01:00
dfa10dd209
fix: skip missing yaml file (#605) 2023-11-23 08:58:32 +01:00
renovate[bot]
82398da75d
chore(deps): lock file maintenance (#603)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-20 09:01:31 +01:00
renovate[bot]
0257b874e9
fix(deps): update dependency jsonschema to v4.20.0 (#601)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-20 09:00:46 +01:00
renovate[bot]
40b96ae285 chore(deps): update dependency ruff to v0.1.6 2023-11-20 03:19:00 +01:00
0f65f50e06
chore: disable logging in pre-commit (#600) 2023-11-15 08:25:54 +01:00
renovate[bot]
9476810896 chore(deps): update dependency ruff to v0.1.5 2023-11-13 02:26:47 +01:00
renovate[bot]
2eb9aad213
chore(deps): lock file maintenance (#593)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-12 21:52:22 +01:00
cacc92f831
fix: parse taskfiles as ansible tasks (#597) 2023-11-12 21:39:41 +01:00
9536cd400d
fix: replace deprecated ruamel.yaml.safe_load (#596) 2023-11-12 14:46:24 +01:00
593a90ff10
chore: drop yapf and favor of the ruff formatter (#595) 2023-11-10 14:50:50 +01:00
renovate[bot]
a1e3e669d4 chore(deps): update dependency ruff to v0.1.4 2023-11-06 01:48:11 +01:00
renovate[bot]
3e1eb79a5b
chore(deps): lock file maintenance (#583)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-04 22:28:48 +01:00
9aba240985
ci: cleanup matrix build name (#591) 2023-11-04 16:18:54 +01:00
renovate[bot]
9ba01f9b99
fix(deps): update dependency ruamel.yaml to v0.18.5 (#590)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-04 16:03:12 +01:00
renovate[bot]
fd30e47e11
fix(deps): update dependency ruamel.yaml to v0.18.3 (#584)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-31 20:43:22 +01:00
renovate[bot]
8f3053d739
fix(deps): update dependency jsonschema to v4.19.2 (#588)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-31 20:08:21 +01:00
renovate[bot]
4f42f5e133 chore(deps): update devdeps non-major 2023-10-30 01:12:34 +01:00
renovate[bot]
0a23dd3539 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.44.0 2023-10-28 23:33:07 +02:00
renovate[bot]
a4a29c1598 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.43.0 2023-10-27 15:57:26 +02:00
renovate[bot]
b33a4b0f60 chore(deps): update devdeps non-major 2023-10-23 03:27:50 +02:00
renovate[bot]
2727ecf6c2 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.42.0 2023-10-21 18:05:35 +02:00
renovate[bot]
a44b7789e5
fix(deps): update dependency ruamel.yaml to v0.17.40 (#580)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-21 15:33:53 +02:00
renovate[bot]
972abb8d9e chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.41.3 2023-10-20 12:57:35 +02:00
renovate[bot]
0456c5b870
fix(deps): update dependency ruamel.yaml to v0.17.39 (#578)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-20 08:59:01 +02:00
renovate[bot]
4d016fcae5 chore(docker): update python:3.12-alpine docker digest to a5d1738 2023-10-19 12:01:56 +02:00
renovate[bot]
6362c1cbcf chore(docker): update python:3.12-alpine docker digest to a4029bd 2023-10-19 08:52:09 +02:00
4fc8c8d923
ci: fix changelog generation 2023-10-18 13:59:23 +02:00
536c74eac1
chore: replace linkcheck by lychee (#575) 2023-10-16 21:34:09 +02:00
315fc2b521
chore: replace git-chglog by git-sv (#574) 2023-10-16 15:43:04 +02:00
renovate[bot]
92fed951b0
chore(deps): lock file maintenance (#571)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-16 14:29:33 +02:00
d6ce15fc00
feat: add support for python 3.12 (#573)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-16 14:15:21 +02:00
66f7738139
fix: remove deprecated distutils (#572) 2023-10-16 12:10:57 +02:00
renovate[bot]
6e0a07f260 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.41.2 2023-10-11 00:36:04 +02:00
renovate[bot]
250df17565
fix(deps): update dependency ruamel.yaml to v0.17.35 (#567)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-09 14:40:53 +02:00
renovate[bot]
9a9f6986b2
chore(deps): lock file maintenance (#569)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-09 14:40:45 +02:00
renovate[bot]
b4e06adc2c chore(deps): update dependency ruff to v0.0.292 2023-10-09 03:34:17 +02:00
renovate[bot]
e78494d258 chore(docker): update python:3.11-alpine docker digest to 3e73c0b 2023-10-03 12:15:02 +02:00
renovate[bot]
c7169539e8 chore(docker): update python:3.11-alpine docker digest to a7a6909 2023-10-03 08:44:13 +02:00
renovate[bot]
0a166c1d39 chore(docker): update python:3.11-alpine docker digest to 297a16d 2023-10-03 07:05:30 +02:00
renovate[bot]
e1044ecc5e
chore(deps): lock file maintenance (#560)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-02 13:28:49 +02:00
9862372841
docs: remove broken galaxy link (#561) 2023-10-02 12:59:05 +02:00
renovate[bot]
0668d31878
fix(deps): update dependency ruamel.yaml to v0.17.33 (#557)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-02 11:14:11 +02:00
renovate[bot]
4c608330dc chore(docker): update python:3.11-alpine docker digest to cd311c6 2023-09-29 18:49:10 +02:00
renovate[bot]
94bbce7bbe chore(docker): update python:3.11-alpine docker digest to ca1736e 2023-09-29 06:43:49 +02:00
renovate[bot]
66523c1c15
chore(deps): lock file maintenance (#552)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-27 13:47:59 +02:00
renovate[bot]
b340dabf24
fix(deps): update dependency jsonschema to v4.19.1 (#555)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-27 13:47:49 +02:00
c5bbdbc764
ci: use secret for s3 endpoint 2023-09-26 21:40:30 +02:00
renovate[bot]
9d227aa7c3 chore(deps): update devdeps non-major 2023-09-25 03:59:51 +02:00
renovate[bot]
eb0a2f2dcd chore(deps): update dependency ruff to v0.0.290 2023-09-18 03:59:19 +02:00
renovate[bot]
05884eddac chore(deps): update dependency pytest to v7.4.2 2023-09-11 04:13:09 +02:00
renovate[bot]
7eb4f91a5d chore(deps): update devdeps non-major 2023-09-04 02:33:06 +02:00
renovate[bot]
036126ee1e chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.41.1 2023-09-04 00:21:09 +02:00
renovate[bot]
4d9366cf7a chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.41.0 2023-09-01 01:06:13 +02:00
renovate[bot]
3d2ba7593d
chore(deps): lock file maintenance (#548)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-29 10:34:15 +02:00
8e3dd49970 fix linting 2023-08-29 10:24:41 +02:00
renovate[bot]
33caaf78c9 chore(deps): update dependency ruff to v0.0.286 2023-08-29 10:24:41 +02:00
renovate[bot]
2b55025150 chore(docker): update python:3.11-alpine docker digest to 5d769f9 2023-08-26 08:16:30 +02:00
renovate[bot]
7f0bc4ad57 chore(docker): update python:3.11-alpine docker digest to 7e8b581 2023-08-26 07:36:30 +02:00
renovate[bot]
89639f82f9 chore(docker): update python:3.11-alpine docker digest to 5324fad 2023-08-26 02:21:53 +02:00
renovate[bot]
4e81bceaa0
chore(deps): lock file maintenance (#540)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-25 00:19:17 +02:00
Theodore Ni
b979852f71
fix: use poetry-dynamic-versioning for PEP 517 builds (#541) 2023-08-25 00:09:52 +02:00
0cf7fc9ce2
ci: migrate to woodpecker (#543) 2023-08-25 00:02:01 +02:00
renovate[bot]
69afdf56ed chore(deps): update dependency ruff to v0.0.285 2023-08-21 03:07:10 +00:00
renovate[bot]
2817668e0a chore(deps): update dependency ruff to v0.0.284 2023-08-14 03:50:17 +00:00
renovate[bot]
220a55e524 chore(docker): update python:3.11-alpine docker digest to 603975e 2023-08-09 14:43:00 +00:00
a4a497ca4e
remove unnecessary newlines in templates (#537) 2023-08-09 09:46:15 +02:00
renovate[bot]
aa29881542 chore(docker): update python:3.11-alpine docker digest to 4352dc7 2023-08-09 07:05:34 +00:00
renovate[bot]
54709b26b7
fix(deps): update dependency jsonschema to v4.19.0 (#534)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-09 07:34:52 +02:00
renovate[bot]
4a3241d0e6
chore(deps): lock file maintenance (#533)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-09 07:33:48 +02:00
renovate[bot]
415aabf64a chore(docker): update python:3.11-alpine docker digest to bd16cc5 2023-08-08 10:04:08 +00:00
renovate[bot]
dbb3a89f5f chore(deps): update dependency ruff to v0.0.282 2023-08-07 03:05:13 +00:00
renovate[bot]
de993d2b8c
fix(deps): update dependency jsonschema to v4.18.6 (#531)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-05 15:50:14 +02:00
renovate[bot]
7e5b22ae03
chore(deps): lock file maintenance (#513)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-02 10:47:32 +02:00
renovate[bot]
825f749898
fix(deps): update dependency pathspec to v0.11.2 (#530)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-02 10:44:25 +02:00
renovate[bot]
18ca26f7ea chore(deps): update dependency ruff to v0.0.280 2023-07-24 04:17:52 +00:00
renovate[bot]
fff4fd7d4b
fix(deps): update dependency jsonschema to v4.18.4 (#521)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-23 16:30:09 +02:00
301de5c654
chore: drop support for python 3.7 (#528)
BREAKING CHANGE: The support for Python 3.7 was removed.
2023-07-23 13:15:53 +02:00
renovate[bot]
114f87306f
chore(deps): update dependency ruff to v0.0.278 (#527)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Robert Kaussow <mail@thegeeklab.de>
2023-07-19 10:16:46 +02:00
renovate[bot]
ad49089c3c chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.40.1 2023-07-12 11:07:02 +00:00
renovate[bot]
8fcc5ea92b chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.40.0 2023-07-11 21:39:32 +00:00
0b031bcec1
ci: bump hugo to v0.115.2 (#525) 2023-07-11 21:29:40 +02:00
renovate[bot]
9b913d4032 chore(deps): update dependency ruff to v0.0.277 2023-07-10 04:24:12 +00:00
renovate[bot]
45547d718b chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.7 2023-07-03 15:09:42 +00:00
renovate[bot]
836f13ffa6 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.6 2023-06-29 00:07:47 +00:00
renovate[bot]
49e4a7183a
chore(deps): update devdeps non-major (#517)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Robert Kaussow <mail@thegeeklab.de>
2023-06-28 09:57:00 +02:00
renovate[bot]
4888d01fae chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.5 2023-06-23 13:06:45 +00:00
1144c6f733
ci: bump hugo to v0.114.0 (#516) 2023-06-23 11:13:52 +02:00
8280a62fb9
docs: replace socialmedia image (#514) 2023-06-20 14:23:27 +02:00
renovate[bot]
584e212f52 chore(deps): update devdeps non-major 2023-06-19 03:32:23 +00:00
renovate[bot]
8faa599a98
fix(deps): update dependency ruamel.yaml to v0.17.32 (#511)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-17 15:22:55 +02:00
renovate[bot]
b84e0569a4 chore(docker): update python:3.11-alpine docker digest to 25df32b 2023-06-15 20:31:29 +00:00
458f9fc577
feat: add vars deprecated and type scope to built-in templates (#509) 2023-06-14 16:47:44 +02:00
renovate[bot]
ea5760fa29
fix(deps): update dependency ruamel.yaml to v0.17.31 (#500)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-14 13:31:22 +02:00
renovate[bot]
b67896d238
chore(deps): lock file maintenance (#501)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-14 13:31:12 +02:00
588f41a3ea
feat: add support for indentation with spaces (#508) 2023-06-14 13:31:01 +02:00
renovate[bot]
b6001fe81d chore(deps): update devdeps non-major 2023-06-12 03:26:53 +00:00
renovate[bot]
7d1478e3c1 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.4 2023-06-09 10:40:13 +00:00
renovate[bot]
98660389a5 chore(docker): update python:3.11-alpine docker digest to 995c7fc 2023-06-08 04:50:10 +00:00
renovate[bot]
eed89ca661 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.3 2023-06-05 15:34:34 +00:00
renovate[bot]
bfd8c8e549 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.2 2023-05-29 15:42:58 +00:00
renovate[bot]
b14b2b5153
chore(deps): lock file maintenance (#498)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-29 12:08:29 +02:00
renovate[bot]
8acb86a6da
fix(deps): update dependency ruamel.yaml to v0.17.28 (#496)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-29 12:08:17 +02:00
renovate[bot]
70f458dce6
chore(deps): update devdeps non-major (#493) 2023-05-28 23:07:24 +02:00
renovate[bot]
6d57d2df59
chore(deps): lock file maintenance (#494)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-28 15:29:07 +02:00
34cc4ca062
chore: remove poetry experimental.new-installer flag (#497) 2023-05-28 15:18:33 +02:00
renovate[bot]
0057baabca
chore(deps): lock file maintenance (#483)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-13 11:12:52 +02:00
renovate[bot]
af85c0ec05
fix(deps): update dependency ruamel.yaml to v0.17.26 (#486)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-13 11:12:09 +02:00
renovate[bot]
4206f228db chore(docker): update python:3.11-alpine docker digest to 4e8e9a5 2023-05-12 17:55:00 +00:00
renovate[bot]
ed7f28bcfa chore(docker): update python:3.11-alpine docker digest to 2f2dadb 2023-05-12 11:38:29 +00:00
renovate[bot]
af340128ba chore(deps): update devdeps non-major 2023-05-08 04:31:04 +00:00
renovate[bot]
d5237a7b7f chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.1 2023-05-04 15:41:02 +00:00
renovate[bot]
370713a178 chore(docker): update python:3.11-alpine docker digest to 7210235 2023-05-03 23:51:24 +00:00
9ab2fd1c0a
fix bare url in contribution file (#488) 2023-05-03 09:31:07 +02:00
renovate[bot]
9667ff2773 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.0 2023-04-20 06:36:51 +00:00
4fbaa27668
ci: switch to new codecov uploader (#484) 2023-04-17 16:22:07 +02:00
renovate[bot]
f72b9573ec chore(deps): update devdeps non-major 2023-04-10 04:54:42 +00:00
renovate[bot]
0ccec85234 chore(docker): update python:3.11-alpine docker digest to 507818d 2023-04-08 01:41:20 +00:00
renovate[bot]
adf9461953 chore(docker): update python:3.11-alpine docker digest to 5405826 2023-04-06 15:48:55 +00:00
596b27e696
fix: fix formatting of meta.license.value in readme template (#479) 2023-04-05 14:08:36 +02:00
renovate[bot]
e4acc05fd9 chore(docker): update python:3.11-alpine docker digest to 4b4078a 2023-03-30 06:57:44 +00:00
renovate[bot]
bc32109897 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.38.1 2023-03-27 22:58:26 +00:00
Germain Lefebvre
26d7a3cb8d
feat: add role requirements to templates (#463) 2023-03-27 21:04:56 +02:00
d47427e128
fix docs for vars multiline example 2023-03-27 13:22:46 +02:00
Germain Lefebvre
3d544b3beb
feat: extend var options with type and deprecated (#462) 2023-03-27 13:18:42 +02:00
renovate[bot]
17a448d416 chore(docker): update python:3.11-alpine docker digest to 8af856d 2023-03-25 01:51:22 +00:00
renovate[bot]
693fcc1359 chore(docker): update python:3.11-alpine docker digest to 506eed4 2023-03-23 19:52:13 +00:00
renovate[bot]
88fc60af80
chore(deps): lock file maintenance (#465) 2023-03-20 10:36:27 +01:00
renovate[bot]
c0f674cbe8
fix(deps): update dependency pathspec to v0.11.1 (#472) 2023-03-20 10:34:42 +01:00
renovate[bot]
578dde6e9a chore(deps): update dependency ruff to v0.0.257 2023-03-20 05:37:38 +00:00
renovate[bot]
d77fa10686 chore(docker): update python:3.11-alpine docker digest to 741e650 2023-03-14 18:40:29 +00:00
renovate[bot]
bc2f11ae0b
chore(deps): update dependency pytest to v7.2.2 (#468) 2023-03-07 14:40:41 +01:00
71c1679d6c
chore: exclude ruff linter rule UP038 (#469) 2023-03-07 14:33:02 +01:00
renovate[bot]
6d293f8b2b chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.38.0 2023-03-05 00:22:35 +00:00
renovate[bot]
7b721dcfa3
fix(deps): update dependency python-json-logger to v2.0.7 (#459) 2023-03-02 08:41:45 +01:00
Enzo Venturi
997959eda2
chore: update comment from "Todo" to "Tag" for tag includes (#466) 2023-03-02 08:41:29 +01:00
renovate[bot]
152e4e6adb
chore(deps): update dependency ruff to v0.0.252 (#464) 2023-02-27 09:03:09 +01:00
renovate[bot]
a1ea9e9a6c chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.37.5 2023-02-27 02:28:24 +00:00
renovate[bot]
f86ab8b187 chore(docker): update python:3.11-alpine docker digest to 1a5c146 2023-02-25 13:01:27 +00:00
renovate[bot]
daf94a971c chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.37.4 2023-02-17 16:08:20 +00:00
a95add9fbe
fix: fix map filter used for meta description (#457) 2023-02-16 20:55:31 +01:00
renovate[bot]
bad8c7e7a1
fix(deps): update dependency python-json-logger to v2.0.6 (#452) 2023-02-16 20:53:10 +01:00
renovate[bot]
641c51a248
chore(deps): lock file maintenance (#454) 2023-02-16 20:52:56 +01:00
renovate[bot]
ea9c5b2dfb chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.37.3 2023-02-16 13:27:48 +00:00
renovate[bot]
6b9690646e chore(deps): update dependency ruff to v0.0.246 2023-02-13 12:50:56 +00:00
8a8647512c
feat: add option to run ansible-doctor recursively (#451) 2023-02-12 12:57:57 +01:00
renovate[bot]
c92a50a9fc chore(docker): update python:3.11-alpine docker digest to 8463061 2023-02-11 21:23:12 +00:00
a50242e345
feat: add pre-commit support (#449) 2023-02-10 19:56:00 +01:00
ffe18075c5
move yapf config to pyproject.toml (#448) 2023-02-10 09:02:31 +01:00
fe62ee77b4
ci: bump container build plugin to drone-docker-buildx:23 (#447) 2023-02-09 19:40:49 +01:00
3aad08646f
fix: join lines with newline instead of space in markdown templates (#446) 2023-02-09 19:27:22 +01:00
renovate[bot]
a761b3c874 chore(docker): update python:3.11-alpine docker digest to deb0f63 2023-02-09 13:12:48 +00:00
1eed0129ed
fix drone-matrix template (#443) 2023-02-08 21:55:26 +01:00
renovate[bot]
7382318cf6
chore(deps): update dependency ruff to v0.0.243 (#441) 2023-02-08 10:21:23 +01:00
renovate[bot]
158bf214d9
chore(deps): lock file maintenance (#442) 2023-02-08 10:03:05 +01:00
renovate[bot]
73ed2d1de2 chore(docker): update python:3.11-alpine docker digest to d8b0703 2023-02-04 13:50:50 +00:00
renovate[bot]
edd40fde71
chore(deps): lock file maintenance (#435) 2023-02-02 09:08:21 +01:00
renovate[bot]
a5fad3b9ff
fix(deps): update dependency pathspec to v0.11.0 (#437) 2023-02-02 08:59:31 +01:00
renovate[bot]
f7530e9bad chore(deps): update dependency ruff to v0.0.237 2023-01-30 06:12:20 +00:00
renovate[bot]
37a887af40 chore(docker): update python:3.11-alpine docker digest to ca1298a 2023-01-24 12:02:39 +00:00
renovate[bot]
6232a5f60f chore(deps): update dependency ruff to v0.0.230 2023-01-23 04:58:01 +00:00
878cce1791
fix: use custom method for annotation split to allow escape chars (#432) 2023-01-22 15:02:09 +01:00
renovate[bot]
457e1fdcf9
chore(deps): update dependency ruff to v0.0.229 (#431) 2023-01-21 22:17:54 +01:00
renovate[bot]
9df909e8a1
chore(deps): lock file maintenance (#427) 2023-01-20 12:08:17 +01:00
194a4e1d82
refctor: migrate flake8 to ruff python linter (#429) 2023-01-20 11:56:12 +01:00
renovate[bot]
52c0c2859c chore(docker): update python:3.11-alpine docker digest to 625383c 2023-01-18 14:15:07 +00:00
4ad870e5c8
refactor: use buildx for multiarch container builds (#425) 2023-01-16 09:10:27 +01:00
renovate[bot]
32ab32d067 chore(deps): update dependency pytest to v7.2.1 2023-01-16 05:39:24 +00:00
renovate[bot]
de0630bd93
chore(deps): lock file maintenance (#420) 2023-01-10 08:48:40 +01:00
renovate[bot]
6501a4bf25 chore(docker): update docker digests 2023-01-10 05:22:49 +00:00
renovate[bot]
11d7424902 chore(deps): update dependency pydocstyle to v6.2.3 2023-01-09 05:18:33 +00:00
renovate[bot]
eddab86b52 chore(docker): update docker digests 2023-01-08 18:47:28 +00:00
dfb4ed99ed
chore: remove support for arm32 (#422)
BREAKING CHANGE: We dropped the arm32 platform support and builds.
2023-01-08 16:12:05 +01:00
renovate[bot]
d4a7557919
chore(deps): update dependency flake8-isort to v6 (#418) 2023-01-03 14:15:09 +01:00
renovate[bot]
1eb4c478d1 chore(deps): update devdependencies (non-major) 2022-12-26 05:06:04 +00:00
renovate[bot]
4ee33538a1 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.37.1 2022-12-21 20:50:09 +00:00
renovate[bot]
dcdf3ab727
chore(deps): lock file maintenance (#416) 2022-12-13 14:20:21 +01:00
renovate[bot]
2ecede4a1d chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.37.0 2022-12-12 02:55:37 +00:00
renovate[bot]
c901597f5f
fix(deps): update dependency pathspec to v0.10.3 (#414) 2022-12-11 12:42:36 +01:00
renovate[bot]
089cde9ce5
chore(deps): lock file maintenance (#406) 2022-12-09 22:53:05 +01:00
renovate[bot]
1de2750875
chore(docker): update docker digests (#413) 2022-12-09 22:52:57 +01:00
renovate[bot]
145807ebd4
fix(deps): update dependency jsonschema to v4.17.3 (#411) 2022-12-04 18:21:28 +01:00
renovate[bot]
d26e830420 chore(docker): update docker digests 2022-11-30 08:15:48 +00:00
renovate[bot]
4fc1e52c4a chore(deps): update dependency flake8-logging-format to v0.9.0 2022-11-28 05:01:23 +00:00
e43b33c96d
ci: use python311 base image on ci (#409) 2022-11-24 21:35:31 +01:00
renovate[bot]
e706eff80c
fix(deps): update dependency jsonschema to v4.17.1 (#407) 2022-11-24 10:46:20 +01:00
renovate[bot]
515723f5b5 chore(deps): update dependency flake8-isort to v5.0.3 2022-11-21 04:33:56 +00:00
renovate[bot]
fa26e18d83
fix(deps): update dependency pathspec to v0.10.2 (#402) 2022-11-18 08:32:26 +01:00
renovate[bot]
bb89eac39b
chore(deps): lock file maintenance (#398) 2022-11-17 21:40:34 +01:00
renovate[bot]
a117896ae4 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.36.1 2022-11-17 00:53:14 +00:00
renovate[bot]
40e69fd64c chore(docker): update docker digests 2022-11-16 12:50:22 +00:00
renovate[bot]
843dff9d78 chore(docker): update docker digests 2022-11-12 15:06:27 +00:00
renovate[bot]
f0097a6404 chore(docker): update docker digests 2022-11-11 18:24:36 +00:00
renovate[bot]
71f32898ec chore(docker): update docker digests 2022-11-11 04:51:02 +00:00
renovate[bot]
f8d496cd9b chore(deps): update dependency flake8-builtins to v2.0.1 2022-11-07 04:02:16 +00:00
96b9304f01
chore: bump hugo to v0.105.0 (#396) 2022-11-05 09:19:55 +01:00
b0ac8e6ef2
ci: refactor broken link check (#395) 2022-11-04 12:58:07 +01:00
renovate[bot]
cd78c948f4 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.36.0 2022-11-02 19:29:49 +00:00
00ac5a2e04
ci: add test step for python 11 (#393) 2022-11-02 13:01:31 +01:00
renovate[bot]
3efac27a0f
chore(deps): lock file maintenance (#391) 2022-11-02 09:10:58 +01:00
renovate[bot]
63da70ced5
fix(deps): update dependency jsonschema to v4.17.0 (#392) 2022-11-02 09:04:59 +01:00
renovate[bot]
1c803d3003 chore(deps): update dependency pytest to v7.2.0 2022-10-31 07:16:32 +00:00
renovate[bot]
fd38b3d28e chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.35.8 2022-10-26 01:53:34 +00:00
renovate[bot]
d6849bda3a
chore(deps): lock file maintenance (#381) 2022-10-25 21:27:14 +02:00
renovate[bot]
de572ab86e
fix(deps): update dependency colorama to v0.4.6 (#385) 2022-10-25 21:27:06 +02:00
renovate[bot]
f2e3e3624d
chore(deps): update arm64v8/python docker tag to v3.11 (#386) 2022-10-25 21:26:51 +02:00
renovate[bot]
067cb3e377
chore(deps): update python docker tag to v3.11 (#387) 2022-10-25 21:26:45 +02:00
renovate[bot]
020f9df485
chore(deps): update arm32v7/python docker tag to v3.11 (#388) 2022-10-25 21:26:38 +02:00
renovate[bot]
ca06777abc chore(docker): update docker digests 2022-10-25 17:08:18 +00:00
renovate[bot]
f4f85fee36 chore(docker): update docker digests 2022-10-20 21:58:01 +00:00
renovate[bot]
a6948d69e2 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.35.7 2022-10-17 11:22:41 +00:00
renovate[bot]
a03bf5aec6 chore(deps): update devdependencies (non-major) 2022-10-10 11:31:17 +00:00
renovate[bot]
763389a669
chore(deps): update dependency flake8-builtins to v2 (#377) 2022-10-09 16:30:46 +02:00
renovate[bot]
5f48819435
chore(deps): update dependency flake8-pep3101 to v2 (#378) 2022-10-09 13:41:44 +02:00
renovate[bot]
4678e576ef
chore(deps): update dependency flake8-isort to v5 (#379) 2022-10-09 11:34:45 +02:00
renovate[bot]
1b6d29cb39 chore(docker): update docker digests 2022-10-07 05:49:32 +00:00
renovate[bot]
dc56ed8651 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.35.6 2022-10-04 11:42:43 +00:00
renovate[bot]
8fd547686e
chore(deps): update dependency pytest-cov to v4 (#373) 2022-09-29 08:54:42 +02:00
renovate[bot]
0c9ba221de chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.35.5 2022-09-28 12:02:23 +00:00
renovate[bot]
097360f3c1 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.35.4 2022-09-24 00:09:41 +00:00
renovate[bot]
cf385791c1 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.35.3 2022-09-19 12:57:14 +00:00
renovate[bot]
438df45cdd
fix(deps): update dependency jsonschema to v4.16.0 (#369) 2022-09-19 09:07:24 +02:00
renovate[bot]
74ae444e40 chore(docker): update docker digests 2022-09-08 15:59:16 +00:00
renovate[bot]
faa851e8db
chore(deps): lock file maintenance (#360) 2022-09-06 09:29:18 +02:00
renovate[bot]
ab3b0d21e8
fix(deps): update dependency jsonschema to v4.15.0 (#363) 2022-09-06 08:40:05 +02:00
renovate[bot]
ced9cce6a8 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.35.2 2022-09-05 22:48:35 +00:00
renovate[bot]
a3692d3af9
fix(deps): update dependency pathspec to v0.10.1 (#362) 2022-09-05 20:37:41 +02:00
renovate[bot]
129ac12b23 chore(deps): update dependency pytest to v7.1.3 2022-09-05 05:09:38 +00:00
renovate[bot]
347ee67204 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.35.1 2022-09-02 15:18:51 +00:00
renovate[bot]
56411bd4dc chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.35.0 2022-08-30 15:42:08 +00:00
renovate[bot]
406c6ff82b chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.34.2 2022-08-23 02:29:46 +00:00
renovate[bot]
c8312d3aa0
fix(deps): update dependency jsonschema to v4.14.0 (#357)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-22 09:59:59 +02:00
renovate[bot]
364d1cb506
chore(deps): lock file maintenance (#334)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-22 09:59:23 +02:00
renovate[bot]
0f707b70a6
chore(deps): update dependency flake8 to v5 (#341)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-22 08:39:47 +02:00
renovate[bot]
4bfe75d991
chore(deps): update devdependencies (non-major) (#354) 2022-08-21 23:10:03 +02:00
renovate[bot]
53867fcae4
fix(deps): update dependency jsonschema to v4.13.0 (#356)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-19 22:26:56 +02:00
renovate[bot]
3c17e21524
fix(deps): update dependency jsonschema to v4.12.1 (#355)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-18 21:58:29 +02:00
renovate[bot]
f09a096329 chore(docker): update docker digests 2022-08-11 05:45:07 +00:00
renovate[bot]
3b7d4f6501 chore(docker): update docker digests to 3fe6aa2 2022-08-10 11:50:55 +00:00
renovate[bot]
d184e8bfb3 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.34.1 2022-08-08 22:34:26 +00:00
renovate[bot]
b37a1d02f6 chore(deps): update dependency flake8-isort to v4.2.0 2022-08-08 04:00:51 +00:00
renovate[bot]
7ed670a570 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.34.0 2022-08-05 00:52:24 +00:00
renovate[bot]
a531725380 chore(docker): update python digest to 4543fd9 2022-08-03 23:21:07 +00:00
renovate[bot]
a100976800
fix(deps): update dependency jsonschema to v4.9.1 (#347) 2022-08-03 20:17:51 +02:00
renovate[bot]
1d579f41d4 chore(docker): update docker digests to 4fd92f2 2022-08-03 15:45:07 +00:00
renovate[bot]
66109806d1 chore(docker): update python digest to ffc9076 2022-08-03 05:42:25 +00:00
renovate[bot]
dd6f263fb0 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.33.2 2022-08-02 04:39:09 +00:00
renovate[bot]
57b4e62825
fix(deps): update dependency jsonschema to v4.9.0 (#342) 2022-08-01 21:16:00 +02:00
renovate[bot]
125d2e2782 chore(deps): update dependency flake8-isort to v4.1.2.post0 2022-08-01 15:58:26 +00:00
renovate[bot]
ca876e0ef2
fix(deps): update dependency jsonschema to v4.8.0 (#340) 2022-07-30 21:43:05 +02:00
renovate[bot]
c4daca384e chore(docker): update docker digests to dcc75b5 2022-07-27 18:03:26 +00:00
renovate[bot]
b0f149e178 chore(docker): update docker digests to fe93ef5 2022-07-27 10:02:48 +00:00
94fcf0c896
ci: switch to thegeeklab/drone-s3-sync plugin 2022-07-26 14:47:50 +02:00
5613be2dca
fix spellcheck 2022-07-25 09:59:24 +02:00
d51fad44a6
[skip ci] adjust repo config 2022-07-21 09:50:57 +02:00
renovate[bot]
c6c6e4089b chore(docker): update docker digests to 8042f9a 2022-07-19 13:35:39 +00:00
renovate[bot]
36083a20d9 chore(docker): update docker digests to 5e8298e 2022-07-19 05:44:10 +00:00
renovate[bot]
dd10cbed00 chore(deps): update dependency pep8-naming to v0.13.1 2022-07-18 03:02:41 +00:00
renovate[bot]
e3b88c84e7 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.33.1 2022-07-17 22:22:28 +00:00
ea2e33993f
ci: switch alpine-tools image 2022-07-17 20:54:33 +02:00
renovate[bot]
b396fb40fe chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.33.0 2022-07-15 19:22:41 +00:00
afd4bd2c26
docs: fix spelling in readme 2022-07-15 08:50:06 +02:00
renovate[bot]
98c1f18377
fix(deps): update dependency python-json-logger to v2.0.4 (#330) 2022-07-13 10:31:18 +02:00
renovate[bot]
fd7ead2b5a
fix(deps): update dependency jsonschema to v4.7.2 (#327) 2022-07-13 08:58:18 +02:00
renovate[bot]
116a01a5b2
chore(deps): lock file maintenance (#323) 2022-07-11 13:29:10 +02:00
renovate[bot]
5dcf169171
fix(deps): update dependency python-json-logger to v2.0.3 (#328) 2022-07-11 10:49:02 +02:00
renovate[bot]
05561c5b4f
fix(deps): update dependency nested-lookup to v0.2.25 (#326) 2022-07-11 08:48:33 +02:00
renovate[bot]
ed4c39b5b9 chore(deps): update dependency pytest-mock to v3.8.2 2022-07-11 03:17:14 +00:00
renovate[bot]
f2f42b3534
fix(deps): update dependency jsonschema to v4.6.1 (#325) 2022-06-29 08:57:23 +02:00
renovate[bot]
27910095a4 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.32.4 2022-06-27 16:22:30 +00:00
renovate[bot]
5852e0432b chore(deps): update dependency pytest-mock to v3.8.1 2022-06-27 03:20:01 +00:00
renovate[bot]
0bc72713e9 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.32.3 2022-06-21 03:27:05 +00:00
renovate[bot]
747c5b0dc6
chore(deps): lock file maintenance (#320) 2022-06-20 10:26:55 +02:00
renovate[bot]
bc9d9ffdc5
fix(deps): update dependency colorama to v0.4.5 (#319) 2022-06-19 15:22:36 +02:00
Renovate Bot
e489f5487e chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.32.2 2022-06-12 18:58:28 +00:00
Renovate Bot
ce9eedb527 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.32.1 2022-06-11 01:03:30 +00:00
Renovate Bot
aa51eefab0 chore(docker): update docker digests to 22fb80b 2022-06-08 02:57:52 +00:00
renovate[bot]
75119bc460
chore(deps): lock file maintenance (#314) 2022-06-07 13:40:11 +02:00
89be30578c
feat: add support for hugo summary (#315) 2022-06-07 13:40:02 +02:00
Renovate Bot
4e2801d1ce chore(deps): update dependency pep8-naming to v0.13.0 2022-06-06 14:48:41 +00:00
Renovate Bot
5e270f544a chore(docker): update docker digests to 7467540 2022-06-03 04:50:22 +00:00
renovate[bot]
14e7911874
chore(deps): lock file maintenance (#305) 2022-06-02 14:05:12 +02:00
renovate[bot]
877ae3d3d8
fix(deps): update dependency jsonschema to v4.6.0 (#311) 2022-06-02 14:04:58 +02:00
Renovate Bot
2eb75d6c67 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.32.0 2022-06-02 01:43:51 +00:00
Renovate Bot
b54937b142 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.31.0 2022-05-31 00:09:25 +00:00
Renovate Bot
003a699fcd chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.30.2 2022-05-26 20:58:42 +00:00
Renovate Bot
7db37a4ed9 chore(docker): update docker digests to 4051162 2022-05-26 03:58:36 +00:00
Renovate Bot
ddb186322c chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.30.1 2022-05-24 12:28:46 +00:00
Renovate Bot
8f81b0dcfd chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.30.0 2022-05-23 00:43:47 +00:00
Renovate Bot
0141cd610c chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.29.6 2022-05-21 20:04:29 +00:00
renovate[bot]
fbd0d349c2
chore(deps): lock file maintenance (#296) 2022-05-20 17:02:49 +02:00
1b4556dc0d
ci: switch to linkchecker (#302) 2022-05-20 16:25:08 +02:00
Renovate Bot
44239e3d86 chore(docker): update docker digests to b1c7b16 2022-05-18 15:01:15 +00:00
b6a2813114
fix: get role name from dependencies in case of a dictionary (#300) 2022-05-17 14:19:31 +02:00
Renovate Bot
9d26ba0238 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.29.5 2022-05-12 18:47:00 +00:00
Renovate Bot
2c0b405ecc chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.29.4 2022-05-07 11:21:02 +00:00
renovate[bot]
aee2f9bf8f
chore(deps): lock file maintenance (#292) 2022-05-06 16:45:12 +02:00
renovate[bot]
058cdd5c07
fix(deps): update dependency jsonschema to v4.5.1 (#294) 2022-05-06 16:44:09 +02:00
Renovate Bot
404ff27309 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.29.3 2022-05-03 01:33:20 +00:00
0de2faf445
update to hugo:0.97.3 in ci 2022-05-02 22:07:12 +02:00
3ceef4365d
docs: fix hugo hint shortcode 2022-05-02 21:51:51 +02:00
Renovate Bot
8e87db349d chore(deps): update devdependencies (non-major) 2022-05-02 05:27:33 +00:00
Renovate Bot
0b0a890b03 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.29.2 2022-04-30 16:02:11 +00:00
ce0cd8a7e6
feat: add option exclude_tags to disable auto-discovery (#289) 2022-04-29 13:19:35 +02:00
renovate[bot]
c43c876057
chore(deps): lock file maintenance (#278) 2022-04-29 12:23:59 +02:00
renovate[bot]
7da5b7596e
fix(deps): update dependency jinja2 to v3.1.2 (#288) 2022-04-29 12:23:50 +02:00
Renovate Bot
e9e741b71b chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.29.1 2022-04-28 13:56:10 +00:00
Renovate Bot
18e30cfa9d chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.29.0 2022-04-23 15:59:28 +00:00
Renovate Bot
bcbfdeed17 chore(docker): update docker digests to 032fd45 2022-04-20 20:40:41 +00:00
Renovate Bot
5322dd2ffd chore(docker): update docker digests to 49d6cf8 2022-04-14 22:25:27 +00:00
Renovate Bot
eee5286179 chore(docker): update docker digests to 31f39ec 2022-04-14 14:27:32 +00:00
f6b1f6bae9
docs: add instrictions how to use the $ operator (#281) 2022-04-12 22:12:50 +02:00
Renovate Bot
4e67f8d912 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.28.0 2022-04-11 15:22:58 +00:00
Renovate Bot
a0195d945f chore(docker): update docker digests to 3703b9d 2022-04-07 19:17:54 +00:00
Renovate Bot
e145e02351 chore(docker): update docker digests to 4f32eeb 2022-04-07 11:55:10 +00:00
Renovate Bot
36effa32a6 chore(docker): update python digest to b9c3acf 2022-04-05 23:05:48 +00:00
Renovate Bot
785baf8183 chore(docker): update docker digests to e619558 2022-04-05 18:34:18 +00:00
b1a1d16bcc
chore: adjust yapf dict formatting to avoid line breaks (#273) 2022-04-04 22:27:37 +02:00
renovate[bot]
904645cbc9
chore(deps): lock file maintenance (#269) 2022-04-04 09:06:04 +02:00
renovate[bot]
2088a9d17c
fix(deps): update dependency anyconfig to v0.13.0 (#272) 2022-04-04 09:05:54 +02:00
Renovate Bot
11fb666161 chore(docker): update docker digests to b927a8a 2022-03-30 18:33:04 +00:00
Renovate Bot
8e8938ebf8 chore(docker): update docker digests to 289e6ba 2022-03-30 00:33:54 +00:00
renovate[bot]
00bae94ed8
chore(deps): lock file maintenance (#258) 2022-03-27 13:13:45 +02:00
renovate[bot]
a6ace7a257
fix(deps): update dependency jinja2 to v3.1.1 (#267) 2022-03-27 13:13:34 +02:00
Renovate Bot
6e91fbf598 chore(docker): update docker digests to dfdc8ff 2022-03-25 12:56:09 +00:00
Renovate Bot
a431656b79 chore(docker): update docker digests to 7393522 2022-03-24 12:20:13 +00:00
Renovate Bot
6fc4af76b4 chore(docker): update python digest to b883b5c 2022-03-24 01:52:46 +00:00
Renovate Bot
c029ac30df chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.27.5 2022-03-21 13:25:33 +00:00
Renovate Bot
06f7275866 chore(docker): update docker digests to 9a1e361 2022-03-21 10:46:52 +00:00
Renovate Bot
f403a53264 chore(deps): update devdependencies (non-major) 2022-03-21 05:51:37 +00:00
Renovate Bot
28922c0b30 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.27.4 2022-03-14 12:11:51 +00:00
Renovate Bot
b3d21791a8 chore(deps): update dependency pytest to v7.1.0 2022-03-14 04:27:51 +00:00
Renovate Bot
f8f769b157 chore(docker): update docker digests to bdf7490 2022-03-08 13:35:34 +00:00
Renovate Bot
29c95ff12a chore(deps): update dependency bandit to v1.7.4 2022-03-07 05:27:21 +00:00
924753ab70
ci: update hugo to v0.93.2 2022-03-05 16:57:00 +01:00
307abeb3cb
fix: catch duplicate key error on yaml load (#256) 2022-03-02 22:37:13 +01:00
renovate[bot]
d9b0178095
chore(deps): lock file maintenance (#254) 2022-03-02 21:06:51 +01:00
6a4328d6d5
fix: allow to force line breaks using '\' in multiline strings (#255) 2022-03-02 14:33:37 +01:00
Renovate Bot
ba2383d894 chore(deps): update dependency bandit to v1.7.3 2022-02-28 03:51:24 +00:00
Renovate Bot
fad6ab5e39 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.27.3 2022-02-26 17:25:39 +00:00
76 changed files with 3055 additions and 3147 deletions

View File

@ -1,23 +0,0 @@
# Changelog
{{ range .Versions -}}
## {{ if .Tag.Previous }}[{{ .Tag.Name }}]({{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}){{ else }}{{ .Tag.Name }}{{ end }} ({{ datetime "2006-01-02" .Tag.Date }})
{{ range .CommitGroups -}}
### {{ .Title }}
{{ range .Commits -}}
- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ (regexReplaceAll "(.*)/issues/(.*)" (regexReplaceAll "(Co-\\w*-by.*)" .Subject "") "${1}/pull/${2}") | trim }}
{{ end }}
{{- end -}}
{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}

View File

@ -1,25 +0,0 @@
style: github
template: CHANGELOG.tpl.md
info:
title: CHANGELOG
repository_url: https://github.com/thegeeklab/ansible-doctor
options:
commit_groups:
title_maps:
feat: Features
fix: Bug Fixes
perf: Performance Improvements
refactor: Code Refactoring
chore: Others
test: Testing
ci: CI Pipeline
docs: Documentation
header:
pattern: "^(\\w*)(?:\\(([\\w\\$\\.\\-\\*\\s]*)\\))?\\:\\s(.*)$"
pattern_maps:
- Type
- Scope
- Subject
notes:
keywords:
- BREAKING CHANGE

View File

@ -8,3 +8,6 @@ SELinux
xoxys xoxys
ansible-.+ ansible-.+
toc toc
GPL-3.0
(P|p)re-(C|c)ommit
JSON

View File

@ -1,493 +0,0 @@
local PythonVersion(pyversion='3.7') = {
name: 'python' + std.strReplace(pyversion, '.', '') + '-pytest',
image: 'python:' + pyversion,
environment: {
PY_COLORS: 1,
},
commands: [
'pip install poetry poetry-dynamic-versioning -qq',
'poetry config experimental.new-installer false',
'poetry install',
'poetry version',
'poetry run ansible-doctor --help',
],
depends_on: [
'fetch',
],
};
local PipelineLint = {
kind: 'pipeline',
name: 'lint',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
name: 'yapf',
image: 'python:3.10',
environment: {
PY_COLORS: 1,
},
commands: [
'git fetch -tq',
'pip install poetry poetry-dynamic-versioning -qq',
'poetry config experimental.new-installer false',
'poetry install',
'poetry run yapf -dr ./ansibledoctor',
],
},
{
name: 'flake8',
image: 'python:3.10',
environment: {
PY_COLORS: 1,
},
commands: [
'git fetch -tq',
'pip install poetry poetry-dynamic-versioning -qq',
'poetry config experimental.new-installer false',
'poetry install',
'poetry run flake8 ./ansibledoctor',
],
},
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineTest = {
kind: 'pipeline',
name: 'test',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
name: 'fetch',
image: 'python:3.10',
commands: [
'git fetch -tq',
],
},
PythonVersion(pyversion='3.7'),
PythonVersion(pyversion='3.8'),
PythonVersion(pyversion='3.9'),
PythonVersion(pyversion='3.10'),
],
depends_on: [
'lint',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineSecurity = {
kind: 'pipeline',
name: 'security',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
name: 'bandit',
image: 'python:3.10',
environment: {
PY_COLORS: 1,
},
commands: [
'git fetch -tq',
'pip install poetry poetry-dynamic-versioning -qq',
'poetry config experimental.new-installer false',
'poetry install',
'poetry run bandit -r ./ansibledoctor -x ./ansibledoctor/test',
],
},
],
depends_on: [
'test',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineBuildPackage = {
kind: 'pipeline',
name: 'build-package',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
name: 'build',
image: 'python:3.10',
commands: [
'git fetch -tq',
'pip install poetry poetry-dynamic-versioning -qq',
'poetry build',
],
},
{
name: 'checksum',
image: 'alpine',
commands: [
'cd dist/ && sha256sum * > ../sha256sum.txt',
],
},
{
name: 'changelog-generate',
image: 'thegeeklab/git-chglog',
commands: [
'git fetch -tq',
'git-chglog --no-color --no-emoji -o CHANGELOG.md ${DRONE_TAG:---next-tag unreleased unreleased}',
],
},
{
name: 'changelog-format',
image: 'thegeeklab/alpine-tools',
commands: [
'prettier CHANGELOG.md',
'prettier -w CHANGELOG.md',
],
},
{
name: 'publish-github',
image: 'plugins/github-release',
settings: {
overwrite: true,
api_key: { from_secret: 'github_token' },
files: ['dist/*', 'sha256sum.txt'],
title: '${DRONE_TAG}',
note: 'CHANGELOG.md',
},
when: {
ref: ['refs/tags/**'],
},
},
{
name: 'publish-pypi',
image: 'python:3.10',
commands: [
'git fetch -tq',
'pip install poetry poetry-dynamic-versioning -qq',
'poetry publish -n',
],
environment: {
POETRY_HTTP_BASIC_PYPI_USERNAME: { from_secret: 'pypi_username' },
POETRY_HTTP_BASIC_PYPI_PASSWORD: { from_secret: 'pypi_password' },
},
when: {
ref: ['refs/tags/**'],
},
},
],
depends_on: [
'security',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineBuildContainer(arch='amd64') = {
local build = if arch == 'arm' then [{
name: 'build',
image: 'python:3.10-alpine',
commands: [
'apk add -Uq --no-cache build-base openssl-dev libffi-dev musl-dev python3-dev git cargo',
'git fetch -tq',
'pip install poetry poetry-dynamic-versioning -qq',
'poetry build',
],
environment: {
CARGO_NET_GIT_FETCH_WITH_CLI: true,
},
}] else [{
name: 'build',
image: 'python:3.10',
commands: [
'git fetch -tq',
'pip install poetry poetry-dynamic-versioning -qq',
'poetry build',
],
}],
kind: 'pipeline',
name: 'build-container-' + arch,
platform: {
os: 'linux',
arch: arch,
},
steps: build + [
{
name: 'dryrun',
image: 'thegeeklab/drone-docker:19',
settings: {
dry_run: true,
dockerfile: 'docker/Dockerfile.' + arch,
repo: 'thegeeklab/${DRONE_REPO_NAME}',
username: { from_secret: 'docker_username' },
password: { from_secret: 'docker_password' },
},
depends_on: ['build'],
when: {
ref: ['refs/pull/**'],
},
},
{
name: 'publish-dockerhub',
image: 'thegeeklab/drone-docker:19',
settings: {
auto_tag: true,
auto_tag_suffix: arch,
dockerfile: 'docker/Dockerfile.' + arch,
repo: 'thegeeklab/${DRONE_REPO_NAME}',
username: { from_secret: 'docker_username' },
password: { from_secret: 'docker_password' },
},
when: {
ref: ['refs/heads/main', 'refs/tags/**'],
},
depends_on: ['dryrun'],
},
{
name: 'publish-quay',
image: 'thegeeklab/drone-docker:19',
settings: {
auto_tag: true,
auto_tag_suffix: arch,
dockerfile: 'docker/Dockerfile.' + arch,
registry: 'quay.io',
repo: 'quay.io/thegeeklab/${DRONE_REPO_NAME}',
username: { from_secret: 'quay_username' },
password: { from_secret: 'quay_password' },
},
when: {
ref: ['refs/heads/main', 'refs/tags/**'],
},
depends_on: ['dryrun'],
},
],
depends_on: [
'security',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineDocs = {
kind: 'pipeline',
name: 'docs',
platform: {
os: 'linux',
arch: 'amd64',
},
concurrency: {
limit: 1,
},
steps: [
{
name: 'assets',
image: 'thegeeklab/alpine-tools',
commands: [
'make doc',
],
},
{
name: 'markdownlint',
image: 'thegeeklab/markdownlint-cli',
commands: [
"markdownlint 'docs/content/**/*.md' 'README.md' 'CONTRIBUTING.md'",
],
},
{
name: 'spellcheck',
image: 'node:lts-alpine',
commands: [
'npm install -g spellchecker-cli',
"spellchecker --files 'docs/content/**/*.md' 'README.md' -d .dictionary -p spell indefinite-article syntax-urls --no-suggestions",
],
environment: {
FORCE_COLOR: true,
NPM_CONFIG_LOGLEVEL: 'error',
},
},
{
name: 'testbuild',
image: 'thegeeklab/hugo:0.91.0',
commands: [
'hugo -s docs/ -b http://localhost/',
],
},
{
name: 'link-validation',
image: 'thegeeklab/link-validator',
commands: [
'link-validator -ro',
],
environment: {
LINK_VALIDATOR_BASE_DIR: 'docs/public',
},
},
{
name: 'build',
image: 'thegeeklab/hugo:0.91.0',
commands: [
'hugo -s docs/',
],
},
{
name: 'beautify',
image: 'node:lts-alpine',
commands: [
'npm install -g js-beautify',
"html-beautify -r -f 'docs/public/**/*.html'",
],
environment: {
FORCE_COLOR: true,
NPM_CONFIG_LOGLEVEL: 'error',
},
},
{
name: 'publish',
image: 'plugins/s3-sync',
settings: {
access_key: { from_secret: 's3_access_key' },
bucket: 'geekdocs',
delete: true,
endpoint: 'https://sp.rknet.org',
path_style: true,
secret_key: { from_secret: 's3_secret_access_key' },
source: 'docs/public/',
strip_prefix: 'docs/public/',
target: '/${DRONE_REPO_NAME}',
},
when: {
ref: ['refs/heads/main', 'refs/tags/**'],
},
},
],
depends_on: [
'build-package',
'build-container-amd64',
'build-container-arm64',
'build-container-arm',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineNotifications = {
kind: 'pipeline',
name: 'notifications',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
image: 'plugins/manifest',
name: 'manifest-dockerhub',
settings: {
ignore_missing: true,
auto_tag: true,
username: { from_secret: 'docker_username' },
password: { from_secret: 'docker_password' },
spec: 'docker/manifest.tmpl',
},
when: {
status: ['success'],
},
},
{
image: 'plugins/manifest',
name: 'manifest-quay',
settings: {
ignore_missing: true,
auto_tag: true,
username: { from_secret: 'quay_username' },
password: { from_secret: 'quay_password' },
spec: 'docker/manifest-quay.tmpl',
},
when: {
status: ['success'],
},
},
{
name: 'pushrm-dockerhub',
pull: 'always',
image: 'chko/docker-pushrm:1',
environment: {
DOCKER_PASS: {
from_secret: 'docker_password',
},
DOCKER_USER: {
from_secret: 'docker_username',
},
PUSHRM_FILE: 'README.md',
PUSHRM_SHORT: 'Annotation based documentation for your Ansible roles',
PUSHRM_TARGET: 'thegeeklab/${DRONE_REPO_NAME}',
},
when: {
status: ['success'],
},
},
{
name: 'pushrm-quay',
pull: 'always',
image: 'chko/docker-pushrm:1',
environment: {
APIKEY__QUAY_IO: {
from_secret: 'quay_token',
},
PUSHRM_FILE: 'README.md',
PUSHRM_TARGET: 'quay.io/thegeeklab/${DRONE_REPO_NAME}',
},
when: {
status: ['success'],
},
},
{
name: 'matrix',
image: 'thegeeklab/drone-matrix',
settings: {
homeserver: { from_secret: 'matrix_homeserver' },
roomid: { from_secret: 'matrix_roomid' },
template: 'Status: **{{ build.Status }}**<br/> Build: [{{ repo.Owner }}/{{ repo.Name }}]({{ build.Link }}){{#if build.Branch}} ({{ build.Branch }}){{/if}} by {{ commit.Author }}<br/> Message: {{ commit.Message.Title }}',
username: { from_secret: 'matrix_username' },
password: { from_secret: 'matrix_password' },
},
when: {
status: ['success', 'failure'],
},
},
],
depends_on: [
'docs',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**'],
status: ['success', 'failure'],
},
};
[
PipelineLint,
PipelineTest,
PipelineSecurity,
PipelineBuildPackage,
PipelineBuildContainer(arch='amd64'),
PipelineBuildContainer(arch='arm64'),
PipelineBuildContainer(arch='arm'),
PipelineDocs,
PipelineNotifications,
]

View File

@ -1,635 +0,0 @@
---
kind: pipeline
name: lint
platform:
os: linux
arch: amd64
steps:
- name: yapf
image: python:3.10
commands:
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry config experimental.new-installer false
- poetry install
- poetry run yapf -dr ./ansibledoctor
environment:
PY_COLORS: 1
- name: flake8
image: python:3.10
commands:
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry config experimental.new-installer false
- poetry install
- poetry run flake8 ./ansibledoctor
environment:
PY_COLORS: 1
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
---
kind: pipeline
name: test
platform:
os: linux
arch: amd64
steps:
- name: fetch
image: python:3.10
commands:
- git fetch -tq
- name: python37-pytest
image: python:3.7
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry config experimental.new-installer false
- poetry install
- poetry version
- poetry run ansible-doctor --help
environment:
PY_COLORS: 1
depends_on:
- fetch
- name: python38-pytest
image: python:3.8
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry config experimental.new-installer false
- poetry install
- poetry version
- poetry run ansible-doctor --help
environment:
PY_COLORS: 1
depends_on:
- fetch
- name: python39-pytest
image: python:3.9
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry config experimental.new-installer false
- poetry install
- poetry version
- poetry run ansible-doctor --help
environment:
PY_COLORS: 1
depends_on:
- fetch
- name: python310-pytest
image: python:3.10
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry config experimental.new-installer false
- poetry install
- poetry version
- poetry run ansible-doctor --help
environment:
PY_COLORS: 1
depends_on:
- fetch
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- lint
---
kind: pipeline
name: security
platform:
os: linux
arch: amd64
steps:
- name: bandit
image: python:3.10
commands:
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry config experimental.new-installer false
- poetry install
- poetry run bandit -r ./ansibledoctor -x ./ansibledoctor/test
environment:
PY_COLORS: 1
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- test
---
kind: pipeline
name: build-package
platform:
os: linux
arch: amd64
steps:
- name: build
image: python:3.10
commands:
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry build
- name: checksum
image: alpine
commands:
- cd dist/ && sha256sum * > ../sha256sum.txt
- name: changelog-generate
image: thegeeklab/git-chglog
commands:
- git fetch -tq
- git-chglog --no-color --no-emoji -o CHANGELOG.md ${DRONE_TAG:---next-tag unreleased unreleased}
- name: changelog-format
image: thegeeklab/alpine-tools
commands:
- prettier CHANGELOG.md
- prettier -w CHANGELOG.md
- name: publish-github
image: plugins/github-release
settings:
api_key:
from_secret: github_token
files:
- dist/*
- sha256sum.txt
note: CHANGELOG.md
overwrite: true
title: ${DRONE_TAG}
when:
ref:
- refs/tags/**
- name: publish-pypi
image: python:3.10
commands:
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry publish -n
environment:
POETRY_HTTP_BASIC_PYPI_PASSWORD:
from_secret: pypi_password
POETRY_HTTP_BASIC_PYPI_USERNAME:
from_secret: pypi_username
when:
ref:
- refs/tags/**
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- security
---
kind: pipeline
name: build-container-amd64
platform:
os: linux
arch: amd64
steps:
- name: build
image: python:3.10
commands:
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry build
- name: dryrun
image: thegeeklab/drone-docker:19
settings:
dockerfile: docker/Dockerfile.amd64
dry_run: true
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/pull/**
depends_on:
- build
- name: publish-dockerhub
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: amd64
dockerfile: docker/Dockerfile.amd64
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
- name: publish-quay
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: amd64
dockerfile: docker/Dockerfile.amd64
password:
from_secret: quay_password
registry: quay.io
repo: quay.io/thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: quay_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- security
---
kind: pipeline
name: build-container-arm64
platform:
os: linux
arch: arm64
steps:
- name: build
image: python:3.10
commands:
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry build
- name: dryrun
image: thegeeklab/drone-docker:19
settings:
dockerfile: docker/Dockerfile.arm64
dry_run: true
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/pull/**
depends_on:
- build
- name: publish-dockerhub
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: arm64
dockerfile: docker/Dockerfile.arm64
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
- name: publish-quay
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: arm64
dockerfile: docker/Dockerfile.arm64
password:
from_secret: quay_password
registry: quay.io
repo: quay.io/thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: quay_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- security
---
kind: pipeline
name: build-container-arm
platform:
os: linux
arch: arm
steps:
- name: build
image: python:3.10-alpine
commands:
- apk add -Uq --no-cache build-base openssl-dev libffi-dev musl-dev python3-dev git cargo
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry build
environment:
CARGO_NET_GIT_FETCH_WITH_CLI: true
- name: dryrun
image: thegeeklab/drone-docker:19
settings:
dockerfile: docker/Dockerfile.arm
dry_run: true
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/pull/**
depends_on:
- build
- name: publish-dockerhub
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: arm
dockerfile: docker/Dockerfile.arm
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
- name: publish-quay
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: arm
dockerfile: docker/Dockerfile.arm
password:
from_secret: quay_password
registry: quay.io
repo: quay.io/thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: quay_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- security
---
kind: pipeline
name: docs
platform:
os: linux
arch: amd64
concurrency:
limit: 1
steps:
- name: assets
image: thegeeklab/alpine-tools
commands:
- make doc
- name: markdownlint
image: thegeeklab/markdownlint-cli
commands:
- markdownlint 'docs/content/**/*.md' 'README.md' 'CONTRIBUTING.md'
- name: spellcheck
image: node:lts-alpine
commands:
- npm install -g spellchecker-cli
- spellchecker --files 'docs/content/**/*.md' 'README.md' -d .dictionary -p spell indefinite-article syntax-urls --no-suggestions
environment:
FORCE_COLOR: true
NPM_CONFIG_LOGLEVEL: error
- name: testbuild
image: thegeeklab/hugo:0.91.0
commands:
- hugo -s docs/ -b http://localhost/
- name: link-validation
image: thegeeklab/link-validator
commands:
- link-validator -ro
environment:
LINK_VALIDATOR_BASE_DIR: docs/public
- name: build
image: thegeeklab/hugo:0.91.0
commands:
- hugo -s docs/
- name: beautify
image: node:lts-alpine
commands:
- npm install -g js-beautify
- html-beautify -r -f 'docs/public/**/*.html'
environment:
FORCE_COLOR: true
NPM_CONFIG_LOGLEVEL: error
- name: publish
image: plugins/s3-sync
settings:
access_key:
from_secret: s3_access_key
bucket: geekdocs
delete: true
endpoint: https://sp.rknet.org
path_style: true
secret_key:
from_secret: s3_secret_access_key
source: docs/public/
strip_prefix: docs/public/
target: /${DRONE_REPO_NAME}
when:
ref:
- refs/heads/main
- refs/tags/**
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- build-package
- build-container-amd64
- build-container-arm64
- build-container-arm
---
kind: pipeline
name: notifications
platform:
os: linux
arch: amd64
steps:
- name: manifest-dockerhub
image: plugins/manifest
settings:
auto_tag: true
ignore_missing: true
password:
from_secret: docker_password
spec: docker/manifest.tmpl
username:
from_secret: docker_username
when:
status:
- success
- name: manifest-quay
image: plugins/manifest
settings:
auto_tag: true
ignore_missing: true
password:
from_secret: quay_password
spec: docker/manifest-quay.tmpl
username:
from_secret: quay_username
when:
status:
- success
- name: pushrm-dockerhub
pull: always
image: chko/docker-pushrm:1
environment:
DOCKER_PASS:
from_secret: docker_password
DOCKER_USER:
from_secret: docker_username
PUSHRM_FILE: README.md
PUSHRM_SHORT: Annotation based documentation for your Ansible roles
PUSHRM_TARGET: thegeeklab/${DRONE_REPO_NAME}
when:
status:
- success
- name: pushrm-quay
pull: always
image: chko/docker-pushrm:1
environment:
APIKEY__QUAY_IO:
from_secret: quay_token
PUSHRM_FILE: README.md
PUSHRM_TARGET: quay.io/thegeeklab/${DRONE_REPO_NAME}
when:
status:
- success
- name: matrix
image: thegeeklab/drone-matrix
settings:
homeserver:
from_secret: matrix_homeserver
password:
from_secret: matrix_password
roomid:
from_secret: matrix_roomid
template: "Status: **{{ build.Status }}**<br/> Build: [{{ repo.Owner }}/{{ repo.Name }}]({{ build.Link }}){{#if build.Branch}} ({{ build.Branch }}){{/if}} by {{ commit.Author }}<br/> Message: {{ commit.Message.Title }}"
username:
from_secret: matrix_username
when:
status:
- success
- failure
trigger:
ref:
- refs/heads/main
- refs/tags/**
status:
- success
- failure
depends_on:
- docs
---
kind: signature
hmac: ba73c2d1d4b473b6e4cff2bc3d7e045a6ca530e0c1951fd13e798e038e23b554
...

View File

@ -52,6 +52,11 @@ branches:
required_status_checks: required_status_checks:
strict: false strict: false
contexts: contexts:
- continuous-integration/drone/pr - ci/woodpecker/pr/lint
enforce_admins: null - ci/woodpecker/pr/test
- ci/woodpecker/pr/build-package
- ci/woodpecker/pr/build-container
- ci/woodpecker/pr/docs
enforce_admins: false
required_linear_history: true
restrictions: null restrictions: null

2
.gitignore vendored
View File

@ -106,6 +106,8 @@ pip-wheel-metadata
docs/themes/ docs/themes/
docs/public/ docs/public/
resources/_gen/ resources/_gen/
.hugo_build.lock
# Misc # Misc
CHANGELOG.md CHANGELOG.md
.ruff_cache

47
.gitsv/config.yml Normal file
View File

@ -0,0 +1,47 @@
---
version: "1.1"
versioning:
update-major: []
update-minor: [feat]
update-patch: [fix, perf, refactor, chore, test, ci, docs]
tag:
pattern: "v%d.%d.%d"
release-notes:
sections:
- name: Features
commit-types: [feat]
section-type: commits
- name: Bug Fixes
commit-types: [fix]
section-type: commits
- name: Performance Improvements
commit-types: [perf]
section-type: commits
- name: Code Refactoring
commit-types: [refactor]
section-type: commits
- name: Others
commit-types: [chore]
section-type: commits
- name: Testing
commit-types: [test]
section-type: commits
- name: CI Pipeline
commit-types: [ci]
section-type: commits
- name: Documentation
commit-types: [docs]
section-type: commits
- name: Breaking Changes
section-type: breaking-changes
commit-message:
footer:
issue:
key: issue
add-value-prefix: "#"
issue:
regex: "#?[0-9]+"

1
.lycheeignore Normal file
View File

@ -0,0 +1 @@
https://hub.docker.com/r/thegeeklab/*

View File

@ -2,5 +2,9 @@
default: True default: True
MD013: False MD013: False
MD041: False MD041: False
MD024: False
MD004: MD004:
style: dash style: dash
MD033:
allowed_elements:
- "br"

10
.pre-commit-hooks.yaml Normal file
View File

@ -0,0 +1,10 @@
---
- id: ansible-doctor
name: ansible-doctor
description: Create annotation based documentation for your Ansible roles.
entry: ansible-doctor -f -qqq
language: python
pass_filenames: False
always_run: True
additional_dependencies:
- .[ansible-core]

View File

@ -1,3 +1,2 @@
.drone.yml
*.tpl.md *.tpl.md
LICENSE LICENSE

View File

@ -0,0 +1,82 @@
---
when:
- event: [pull_request, tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
steps:
- name: build
image: docker.io/library/python:3.13
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry build
- name: security-build
image: quay.io/thegeeklab/wp-docker-buildx:5
depends_on: [build]
settings:
containerfile: Containerfile.multiarch
output: type=oci,dest=oci/${CI_REPO_NAME},tar=false
repo: ${CI_REPO}
- name: security-scan
image: docker.io/aquasec/trivy
depends_on: [security-build]
commands:
- trivy -v
- trivy image --input oci/${CI_REPO_NAME}
environment:
TRIVY_EXIT_CODE: "1"
TRIVY_IGNORE_UNFIXED: "true"
TRIVY_NO_PROGRESS: "true"
TRIVY_SEVERITY: HIGH,CRITICAL
TRIVY_TIMEOUT: 1m
TRIVY_DB_REPOSITORY: docker.io/aquasec/trivy-db:2
- name: publish-dockerhub
image: quay.io/thegeeklab/wp-docker-buildx:5
depends_on: [security-scan]
settings:
auto_tag: true
containerfile: Containerfile.multiarch
password:
from_secret: docker_password
platforms:
- linux/amd64
- linux/arm64
provenance: false
repo: ${CI_REPO}
username:
from_secret: docker_username
when:
- event: [tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
- name: publish-quay
image: quay.io/thegeeklab/wp-docker-buildx:5
depends_on: security-scan
settings:
auto_tag: true
containerfile: Containerfile.multiarch
password:
from_secret: quay_password
platforms:
- linux/amd64
- linux/arm64
provenance: false
registry: quay.io
repo: quay.io/${CI_REPO}
username:
from_secret: quay_username
when:
- event: [tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
depends_on:
- lint
- test

View File

@ -0,0 +1,56 @@
---
when:
- event: [pull_request, tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
steps:
- name: build
image: docker.io/library/python:3.13
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry build
- name: checksum
image: quay.io/thegeeklab/alpine-tools
commands:
- cd dist/ && sha256sum * > ../sha256sum.txt
- name: changelog
image: quay.io/thegeeklab/git-sv
commands:
- git sv current-version
- git sv release-notes -t ${CI_COMMIT_TAG:-next} -o CHANGELOG.md
- cat CHANGELOG.md
- name: publish-github
image: docker.io/plugins/github-release
settings:
api_key:
from_secret: github_token
files:
- dist/*
- sha256sum.txt
note: CHANGELOG.md
overwrite: true
title: ${CI_COMMIT_TAG}
when:
- event: [tag]
- name: publish-pypi
image: docker.io/library/python:3.13
environment:
POETRY_HTTP_BASIC_PYPI_PASSWORD:
from_secret: pypi_password
POETRY_HTTP_BASIC_PYPI_USERNAME:
from_secret: pypi_username
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry publish -n
when:
- event: [tag]
depends_on:
- lint
- test

101
.woodpecker/docs.yml Normal file
View File

@ -0,0 +1,101 @@
---
when:
- event: [pull_request, tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
steps:
- name: assets
image: quay.io/thegeeklab/alpine-tools
commands:
- make doc
- name: markdownlint
image: quay.io/thegeeklab/markdownlint-cli
depends_on: [assets]
commands:
- markdownlint 'README.md' 'CONTRIBUTING.md'
- name: spellcheck
image: quay.io/thegeeklab/alpine-tools
depends_on: [assets]
commands:
- spellchecker --files 'docs/**/*.md' 'README.md' 'CONTRIBUTING.md' -d .dictionary -p spell indefinite-article syntax-urls
environment:
FORCE_COLOR: "true"
- name: link-validation
image: docker.io/lycheeverse/lychee
depends_on: [assets]
commands:
- lychee --no-progress --format detailed docs/content README.md
- name: build
image: quay.io/thegeeklab/hugo:0.136.5
depends_on: [link-validation]
commands:
- hugo --panicOnWarning -s docs/
- name: beautify
image: quay.io/thegeeklab/alpine-tools
depends_on: [build]
commands:
- html-beautify -r -f 'docs/public/**/*.html'
- name: publish
image: quay.io/thegeeklab/wp-s3-action
depends_on: [beautify]
settings:
access_key:
from_secret: s3_access_key
bucket: geekdocs
delete: true
endpoint:
from_secret: s3_endpoint
path_style: true
secret_key:
from_secret: s3_secret_access_key
source: docs/public/
strip_prefix: docs/public/
target: /${CI_REPO_NAME}
when:
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
status: [success, failure]
- name: pushrm-dockerhub
image: docker.io/chko/docker-pushrm:1
depends_on: [publish]
environment:
DOCKER_PASS:
from_secret: docker_password
DOCKER_USER:
from_secret: docker_username
PUSHRM_FILE: README.md
PUSHRM_SHORT: Annotation based documentation for your Ansible roles
PUSHRM_TARGET: ${CI_REPO}
when:
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
status: [success]
- name: pushrm-quay
image: docker.io/chko/docker-pushrm:1
depends_on: [publish]
environment:
APIKEY__QUAY_IO:
from_secret: quay_token
PUSHRM_FILE: README.md
PUSHRM_TARGET: quay.io/${CI_REPO}
when:
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
status: [success]
depends_on:
- build-package
- build-container

37
.woodpecker/lint.yml Normal file
View File

@ -0,0 +1,37 @@
---
when:
- event: [pull_request, tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
steps:
- name: check-format
image: docker.io/library/python:3.13
depends_on: []
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry install -E ansible-core
- poetry run ruff format --check --diff ./${CI_REPO_NAME//-/}
environment:
PY_COLORS: "1"
- name: check-coding
image: docker.io/library/python:3.13
depends_on: []
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry install -E ansible-core
- poetry run ruff check ./${CI_REPO_NAME//-/}
environment:
PY_COLORS: "1"
- name: check-jinja
image: docker.io/library/python:3.13
depends_on: []
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry install -E ansible-core
- poetry run j2lint ansibledoctor/templates/ -i jinja-statements-indentation jinja-statements-delimiter
environment:
PY_COLORS: "1"

26
.woodpecker/notify.yml Normal file
View File

@ -0,0 +1,26 @@
---
when:
- event: [tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
runs_on: [success, failure]
steps:
- name: matrix
image: quay.io/thegeeklab/wp-matrix
settings:
homeserver:
from_secret: matrix_homeserver
room_id:
from_secret: matrix_room_id
user_id:
from_secret: matrix_user_id
access_token:
from_secret: matrix_access_token
when:
- status: [success, failure]
depends_on:
- docs

34
.woodpecker/test.yml Normal file
View File

@ -0,0 +1,34 @@
---
when:
- event: [pull_request, tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
variables:
- &pytest_base
depends_on: []
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry install -E ansible-core
- poetry version
- poetry run ${CI_REPO_NAME} --help
environment:
PY_COLORS: "1"
steps:
- name: python-313
image: docker.io/library/python:3.13
<<: *pytest_base
- name: python-312
image: docker.io/library/python:3.12
<<: *pytest_base
- name: python-311
image: docker.io/library/python:3.11
<<: *pytest_base
- name: python-310
image: docker.io/library/python:3.10
<<: *pytest_base

View File

@ -3,7 +3,7 @@
## Security ## Security
If you think you have found a **security issue**, please do not mention it in this repository. If you think you have found a **security issue**, please do not mention it in this repository.
Instead, send an email to security@thegeeklab.de with as many details as possible so it can be handled confidential. Instead, send an email to `security@thegeeklab.de` with as many details as possible so it can be handled confidential.
## Bug Reports and Feature Requests ## Bug Reports and Feature Requests

View File

@ -1,4 +1,4 @@
FROM python:3.10-alpine@sha256:a9865ba6472324621e81e1da5cbd02069d528215a4b49d49695eac693c10488a FROM python:3.13-alpine@sha256:fcbcbbecdeae71d3b77445d9144d1914df55110f825ab62b04a66c7c33c09373
LABEL maintainer="Robert Kaussow <mail@thegeeklab.de>" LABEL maintainer="Robert Kaussow <mail@thegeeklab.de>"
LABEL org.opencontainers.image.authors="Robert Kaussow <mail@thegeeklab.de>" LABEL org.opencontainers.image.authors="Robert Kaussow <mail@thegeeklab.de>"
@ -12,9 +12,9 @@ ENV TZ=UTC
ADD dist/ansible_doctor-*.whl / ADD dist/ansible_doctor-*.whl /
RUN apk --update add --virtual .build-deps build-base libffi-dev openssl-dev && \ RUN apk --update add --virtual .build-deps build-base libffi-dev openssl-dev git && \
pip install --upgrade --no-cache-dir pip && \ pip install --upgrade --no-cache-dir pip && \
pip install --no-cache-dir $(find / -name "ansible_doctor-*.whl") && \ pip install --no-cache-dir $(find / -name "ansible_doctor-*.whl")[ansible-core] && \
rm -f ansible_doctor-*.whl && \ rm -f ansible_doctor-*.whl && \
rm -rf /var/cache/apk/* && \ rm -rf /var/cache/apk/* && \
rm -rf /root/.cache/ rm -rf /root/.cache/

View File

@ -1,5 +1,5 @@
# renovate: datasource=github-releases depName=thegeeklab/hugo-geekdoc # renovate: datasource=github-releases depName=thegeeklab/hugo-geekdoc
THEME_VERSION := v0.27.2 THEME_VERSION := v1.2.1
THEME := hugo-geekdoc THEME := hugo-geekdoc
BASEDIR := docs BASEDIR := docs
THEMEDIR := $(BASEDIR)/themes THEMEDIR := $(BASEDIR)/themes

View File

@ -2,7 +2,7 @@
Annotation based documentation for your Ansible roles Annotation based documentation for your Ansible roles
[![Build Status](https://img.shields.io/drone/build/thegeeklab/ansible-doctor?logo=drone&server=https%3A%2F%2Fdrone.thegeeklab.de)](https://drone.thegeeklab.de/thegeeklab/ansible-doctor) [![Build Status](https://ci.thegeeklab.de/api/badges/thegeeklab/ansible-doctor/status.svg)](https://ci.thegeeklab.de/repos/thegeeklab/ansible-doctor)
[![Docker Hub](https://img.shields.io/badge/dockerhub-latest-blue.svg?logo=docker&logoColor=white)](https://hub.docker.com/r/thegeeklab/ansible-doctor) [![Docker Hub](https://img.shields.io/badge/dockerhub-latest-blue.svg?logo=docker&logoColor=white)](https://hub.docker.com/r/thegeeklab/ansible-doctor)
[![Quay.io](https://img.shields.io/badge/quay-latest-blue.svg?logo=docker&logoColor=white)](https://quay.io/repository/thegeeklab/ansible-doctor) [![Quay.io](https://img.shields.io/badge/quay-latest-blue.svg?logo=docker&logoColor=white)](https://quay.io/repository/thegeeklab/ansible-doctor)
[![Python Version](https://img.shields.io/pypi/pyversions/ansible-doctor.svg)](https://pypi.org/project/ansible-doctor/) [![Python Version](https://img.shields.io/pypi/pyversions/ansible-doctor.svg)](https://pypi.org/project/ansible-doctor/)
@ -22,7 +22,7 @@ The full documentation is available at [https://ansible-doctor.geekdocs.de](http
## Contributors ## Contributors
Special thanks goes to all [contributors](https://github.com/thegeeklab/ansible-doctor/graphs/contributors). If you would like to contribute, Special thanks to all [contributors](https://github.com/thegeeklab/ansible-doctor/graphs/contributors). If you would like to contribute,
please see the [instructions](https://github.com/thegeeklab/ansible-doctor/blob/main/CONTRIBUTING.md). please see the [instructions](https://github.com/thegeeklab/ansible-doctor/blob/main/CONTRIBUTING.md).
## License ## License

View File

@ -1,3 +1,10 @@
"""Default package.""" """Provide version information."""
__version__ = "0.0.0" __version__ = "0.0.0"
import sys
try:
import ansible # noqa
except ImportError:
sys.exit("ERROR: Python requirements are missing: 'ansible-core' not found.")

View File

@ -6,9 +6,10 @@ import re
from collections import defaultdict from collections import defaultdict
import anyconfig import anyconfig
import structlog
from ansibledoctor.config import SingleConfig from ansibledoctor.config import SingleConfig
from ansibledoctor.utils import SingleLog from ansibledoctor.utils import _split_string, sysexit_with_message
class AnnotationItem: class AnnotationItem:
@ -20,9 +21,11 @@ class AnnotationItem:
def __str__(self): def __str__(self):
"""Beautify object string output.""" """Beautify object string output."""
for key in self.data.keys(): for key in self.data:
for sub in self.data.get(key): for sub in self.data.get(key):
return "AnnotationItem({}: {})".format(key, sub) return f"AnnotationItem({key}: {sub})"
return "None"
def get_obj(self): def get_obj(self):
return self.data return self.data
@ -35,13 +38,12 @@ class Annotation:
self._all_items = defaultdict(dict) self._all_items = defaultdict(dict)
self._file_handler = None self._file_handler = None
self.config = SingleConfig() self.config = SingleConfig()
self.log = SingleLog() self.log = structlog.get_logger()
self.logger = self.log.logger
self._files_registry = files_registry self._files_registry = files_registry
self._all_annotations = self.config.get_annotations_definition() self._all_annotations = self.config.get_annotations_definition()
if name in self._all_annotations.keys(): if name in self._all_annotations:
self._annotation_definition = self._all_annotations[name] self._annotation_definition = self._all_annotations[name]
if self._annotation_definition is not None: if self._annotation_definition is not None:
@ -53,8 +55,7 @@ class Annotation:
def _find_annotation(self): def _find_annotation(self):
regex = r"(\#\ *\@" + self._annotation_definition["name"] + r"\ +.*)" regex = r"(\#\ *\@" + self._annotation_definition["name"] + r"\ +.*)"
for rfile in self._files_registry.get_files(): for rfile in self._files_registry.get_files():
self._file_handler = open(rfile, encoding="utf8") with open(rfile, encoding="utf8") as self._file_handler:
num = 1 num = 1
while True: while True:
line = self._file_handler.readline() line = self._file_handler.readline()
@ -66,14 +67,12 @@ class Annotation:
num, line, self._annotation_definition["name"], rfile num, line, self._annotation_definition["name"], rfile
) )
if item: if item:
self.logger.info(str(item)) self.log.info(f"Found {item!s}")
self._populate_item( self._populate_item(
item.get_obj().items(), self._annotation_definition["name"] item.get_obj().items(), self._annotation_definition["name"]
) )
num += 1 num += 1
self._file_handler.close()
def _populate_item(self, item, name): def _populate_item(self, item, name):
allow_multiple = self.config.ANNOTATIONS.get(name)["allow_multiple"] allow_multiple = self.config.ANNOTATIONS.get(name)["allow_multiple"]
@ -86,9 +85,7 @@ class Annotation:
try: try:
anyconfig.merge(self._all_items[key], value, ac_merge=anyconfig.MS_DICTS) anyconfig.merge(self._all_items[key], value, ac_merge=anyconfig.MS_DICTS)
except ValueError as e: except ValueError as e:
self.log.sysexit_with_message( sysexit_with_message("Failed to merge annotation values", error=e)
"Unable to merge annotation values:\n{}".format(e)
)
def _get_annotation_data(self, num, line, name, rfile): def _get_annotation_data(self, num, line, name, rfile):
""" """
@ -103,26 +100,26 @@ class Annotation:
line1 = re.sub(reg1, "", line).strip() line1 = re.sub(reg1, "", line).strip()
# step3 take the main key value from the annotation # step3 take the main key value from the annotation
parts = [part.strip() for part in line1.split(":", 2)] parts = [part.strip() for part in _split_string(line1, ":", "\\", 2)]
key = str(parts[0]) key = str(parts[0])
item.data[key] = {} item.data[key] = {}
multiline_char = [">", "$>"] multiline_char = [">", "$>"]
if len(parts) < 2: if len(parts) < 2:
return return None
if len(parts) == 2: if len(parts) == 2:
parts = parts[:1] + ["value"] + parts[1:] parts = parts[:1] + ["value"] + parts[1:]
subtypes = self.config.ANNOTATIONS.get(name)["subtypes"] subtypes = self.config.ANNOTATIONS.get(name)["subtypes"]
if subtypes and parts[1] not in subtypes: if subtypes and parts[1] not in subtypes:
return return None
content = [parts[2]] content = [parts[2]]
if parts[2] not in multiline_char and parts[2].startswith("$"): if parts[2] not in multiline_char and parts[2].startswith("$"):
source = parts[2].replace("$", "").strip() source = parts[2].replace("$", "").strip()
content = self._str_to_json(key, source, rfile, num, line) content = self._str_to_json(key, source, rfile, num)
item.data[key][parts[1]] = content item.data[key][parts[1]] = content
@ -131,7 +128,8 @@ class Annotation:
multiline = [] multiline = []
stars_with_annotation = r"(\#\ *[\@][\w]+)" stars_with_annotation = r"(\#\ *[\@][\w]+)"
current_file_position = self._file_handler.tell() current_file_position = self._file_handler.tell()
newline = "" before = ""
after = ""
while True: while True:
next_line = self._file_handler.readline().lstrip() next_line = self._file_handler.readline().lstrip()
@ -154,31 +152,34 @@ class Annotation:
final = re.findall(r"\#(.*)", next_line)[0].rstrip() final = re.findall(r"\#(.*)", next_line)[0].rstrip()
if final[:1] == " ": if final[:1] == " ":
final = final[1:] final = final[1:]
final = newline + final final = before + final
# match if empty line or commented empty line # match if empty line or commented empty line
test_line = next_line.replace("#", "").strip() test_line = next_line.replace("#", "").strip()
if len(test_line) == 0: if len(test_line) == 0:
newline = "\n\n" before = "\n\n"
continue continue
else: before = ""
newline = ""
multiline.append(newline + final) if test_line.endswith("\\"):
final = final.rstrip("\\").strip()
after = "\n"
else:
after = ""
multiline.append(before + final + after)
if parts[2].startswith("$"): if parts[2].startswith("$"):
source = "".join([x.strip() for x in multiline]) source = "".join([x.strip() for x in multiline])
multiline = self._str_to_json(key, source, rfile, num, line) multiline = self._str_to_json(key, source, rfile, num)
item.data[key][parts[1]] = multiline item.data[key][parts[1]] = multiline
return item return item
def _str_to_json(self, key, string, rfile, num, line): def _str_to_json(self, key, string, rfile, num):
try: try:
return {key: json.loads(string)} return {key: json.loads(string)}
except ValueError: except ValueError:
self.log.sysexit_with_message( sysexit_with_message(
"Json value error: Can't parse json in {}:{}:\n{}".format( f"ValueError: Failed to parse json in {rfile}:{num!s}", file=rfile
rfile, str(num), line.strip()
)
) )

View File

@ -2,29 +2,36 @@
"""Entrypoint and CLI handler.""" """Entrypoint and CLI handler."""
import argparse import argparse
import os
import structlog
import ansibledoctor.exception import ansibledoctor.exception
from ansibledoctor import __version__ from ansibledoctor import __version__
from ansibledoctor.config import SingleConfig from ansibledoctor.config import SingleConfig
from ansibledoctor.doc_generator import Generator from ansibledoctor.doc_generator import Generator
from ansibledoctor.doc_parser import Parser from ansibledoctor.doc_parser import Parser
from ansibledoctor.utils import SingleLog from ansibledoctor.utils import sysexit_with_message
class AnsibleDoctor: class AnsibleDoctor:
"""Main doctor object.""" """Create main object."""
log = structlog.get_logger()
def __init__(self): def __init__(self):
self.log = SingleLog() try:
self.logger = self.log.logger self.config = SingleConfig()
self.args = self._cli_args() self.config.load(args=self._parse_args())
self.config = self._get_config() self._execute()
except ansibledoctor.exception.DoctorError as e:
sysexit_with_message(e)
except FileNotFoundError as e:
sysexit_with_message("Base directory not found", path=e.filename)
except KeyboardInterrupt:
sysexit_with_message("Aborted...")
doc_parser = Parser() def _parse_args(self):
doc_generator = Generator(doc_parser)
doc_generator.render()
def _cli_args(self):
""" """
Use argparse for parsing CLI arguments. Use argparse for parsing CLI arguments.
@ -35,72 +42,106 @@ class AnsibleDoctor:
description="Generate documentation from annotated Ansible roles using templates" description="Generate documentation from annotated Ansible roles using templates"
) )
parser.add_argument( parser.add_argument(
"role_dir", nargs="?", help="role directory (default: current working dir)" "base_dir",
nargs="?",
default=self.config.config.base_dir,
help="base directory (default: current working directory)",
) )
parser.add_argument( parser.add_argument(
"-c", "--config", dest="config_file", help="location of configuration file" "-c",
"--config",
dest="config_file",
help="path to configuration file",
) )
parser.add_argument( parser.add_argument(
"-o", "--output", dest="output_dir", action="store", help="output base dir" "-o",
"--output",
dest="renderer__dest",
action="store",
default=self.config.config.renderer.dest,
help="output directory",
metavar="OUTPUT_DIR",
)
parser.add_argument(
"-r",
"--recursive",
dest="recursive",
action="store_true",
default=self.config.config.recursive,
help="run recursively over the base directory subfolders",
) )
parser.add_argument( parser.add_argument(
"-f", "-f",
"--force", "--force",
dest="force_overwrite", dest="renderer.force_overwrite",
action="store_true", action="store_true",
default=None, default=self.config.config.renderer.force_overwrite,
help="force overwrite output file" help="force overwrite output file",
) )
parser.add_argument( parser.add_argument(
"-d", "-d",
"--dry-run", "--dry-run",
dest="dry_run", dest="dry_run",
action="store_true", action="store_true",
default=None, default=self.config.config.dry_run,
help="dry run without writing" help="dry run without writing",
) )
parser.add_argument( parser.add_argument(
"-n", "-n",
"--no-role-detection", "--no-role-detection",
dest="role_detection", dest="role_detection",
action="store_false", action="store_false",
default=None, default=self.config.config.role.autodetect,
help="disable automatic role detection" help="disable automatic role detection",
) )
parser.add_argument( parser.add_argument(
"-v", dest="logging.level", action="append_const", const=-1, help="increase log level" "-v",
dest="logging.level",
action="append_const",
const=-1,
help="increase log level",
) )
parser.add_argument( parser.add_argument(
"-q", dest="logging.level", action="append_const", const=1, help="decrease log level" "-q",
dest="logging.level",
action="append_const",
const=1,
help="decrease log level",
) )
parser.add_argument( parser.add_argument(
"--version", action="version", version="%(prog)s {}".format(__version__) "--version",
action="version",
version=f"%(prog)s {__version__}",
) )
return parser.parse_args().__dict__ return parser.parse_args().__dict__
def _get_config(self): def _execute(self):
try: cwd = os.path.abspath(self.config.config.base_dir)
config = SingleConfig(args=self.args) walkdirs = [cwd]
except ansibledoctor.exception.ConfigError as e:
self.log.sysexit_with_message(e)
try: if self.config.config.recursive:
self.log.set_level(config.config["logging"]["level"]) walkdirs = [f.path for f in os.scandir(cwd) if f.is_dir()]
except ValueError as e:
self.log.sysexit_with_message("Can not set log level.\n{}".format(str(e)))
if config.config["role_detection"]: for item in walkdirs:
if config.is_role: os.chdir(item)
self.logger.info("Ansible role detected") self.config.load(root_path=os.getcwd())
self.log.debug("Switch working directory", path=item)
self.log.info("Lookup config file", path=self.config.config_files)
if self.config.config.role.autodetect:
if self.config.is_role():
structlog.contextvars.bind_contextvars(role=self.config.config.role_name)
self.log.info("Ansible role detected")
else: else:
self.log.sysexit_with_message("No Ansible role detected") sysexit_with_message("No Ansible role detected")
else: else:
self.logger.info("Ansible role detection disabled") self.log.info("Ansible role detection disabled")
self.logger.info("Using config file {}".format(config.config_file)) doc_parser = Parser()
doc_generator = Generator(doc_parser)
return config doc_generator.render()
def main(): def main():

View File

@ -1,303 +1,226 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""Global settings definition.""" """Global settings definition."""
import logging
import os import os
import re
from io import StringIO
import anyconfig import colorama
import environs import structlog
import jsonschema.exceptions
import ruamel.yaml
from appdirs import AppDirs from appdirs import AppDirs
from jsonschema._utils import format_as_index from dynaconf import Dynaconf, ValidationError, Validator
import ansibledoctor.exception import ansibledoctor.exception
from ansibledoctor.utils import Singleton from ansibledoctor.utils import Singleton
config_dir = AppDirs("ansible-doctor").user_config_dir
default_config_file = os.path.join(config_dir, "config.yml")
class Config:
class Config(): """Create configuration object."""
"""
Create an object with all necessary settings.
Settings are loade from multiple locations in defined order (last wins):
- default settings defined by `self._get_defaults()`
- yaml config file, defaults to OS specific user config dir (https://pypi.org/project/appdirs/)
- provides cli parameters
"""
SETTINGS = {
"config_file": {
"default": "",
"env": "CONFIG_FILE",
"type": environs.Env().str
},
"role_dir": {
"default": "",
"env": "ROLE_DIR",
"type": environs.Env().str
},
"role_name": {
"default": "",
"env": "ROLE_NAME",
"type": environs.Env().str
},
"dry_run": {
"default": False,
"env": "DRY_RUN",
"file": True,
"type": environs.Env().bool
},
"logging.level": {
"default": "WARNING",
"env": "LOG_LEVEL",
"file": True,
"type": environs.Env().str
},
"logging.json": {
"default": False,
"env": "LOG_JSON",
"file": True,
"type": environs.Env().bool
},
"output_dir": {
"default": os.getcwd(),
"env": "OUTPUT_DIR",
"file": True,
"type": environs.Env().str
},
"template_dir": {
"default": os.path.join(os.path.dirname(os.path.realpath(__file__)), "templates"),
"env": "TEMPLATE_DIR",
"file": True,
"type": environs.Env().str
},
"template": {
"default": "readme",
"env": "TEMPLATE",
"file": True,
"type": environs.Env().str
},
"force_overwrite": {
"default": False,
"env": "FORCE_OVERWRITE",
"file": True,
"type": environs.Env().bool
},
"custom_header": {
"default": "",
"env": "CUSTOM_HEADER",
"file": True,
"type": environs.Env().str
},
"exclude_files": {
"default": [],
"env": "EXCLUDE_FILES",
"file": True,
"type": environs.Env().list
},
"role_detection": {
"default": True,
"env": "ROLE_DETECTION",
"file": True,
"type": environs.Env().bool
},
}
ANNOTATIONS = { ANNOTATIONS = {
"meta": { "meta": {
"name": "meta", "name": "meta",
"automatic": True, "automatic": True,
"subtypes": ["value"], "subtypes": ["value"],
"allow_multiple": False "allow_multiple": False,
}, },
"todo": { "todo": {
"name": "todo", "name": "todo",
"automatic": True, "automatic": True,
"subtypes": ["value"], "subtypes": ["value"],
"allow_multiple": True "allow_multiple": True,
}, },
"var": { "var": {
"name": "var", "name": "var",
"automatic": True, "automatic": True,
"subtypes": ["value", "example", "description"], "subtypes": ["value", "example", "description", "type", "deprecated"],
"allow_multiple": False "allow_multiple": False,
}, },
"example": { "example": {
"name": "example", "name": "example",
"automatic": True, "automatic": True,
"subtypes": [], "subtypes": [],
"allow_multiple": False "allow_multiple": False,
}, },
"tag": { "tag": {
"name": "tag", "name": "tag",
"automatic": True, "automatic": True,
"subtypes": ["value", "description"], "subtypes": ["value", "description"],
"allow_multiple": False "allow_multiple": False,
}, },
} }
def __init__(self, args={}): def __init__(self):
""" self.config_files = [
Initialize a new settings class. os.path.join(AppDirs("ansible-doctor").user_config_dir, "config.yml"),
".ansibledoctor",
".ansibledoctor.yml",
".ansibledoctor.yaml",
]
self.config_merge = True
self.args = {}
self.load()
:param args: An optional dict of options, arguments and commands from the CLI. def load(self, root_path=None, args=None):
:param config_file: An optional path to a yaml config file. tmpl_src = os.path.join(os.path.dirname(os.path.realpath(__file__)), "templates")
:returns: None tmpl_provider = ["local", "git"]
""" if args:
self._args = args if args.get("config_file"):
self._schema = None self.config_merge = False
self.config_file = default_config_file self.config_files = [os.path.abspath(args.get("config_file"))]
self.role_dir = os.getcwd() args.pop("config_file")
self.config = None
self._set_config()
self.is_role = self._set_is_role() or False
def _get_args(self, args): self.args = args
cleaned = dict(filter(lambda item: item[1] is not None, args.items()))
normalized = {} self.config = Dynaconf(
for key, value in cleaned.items(): envvar_prefix="ANSIBLE_DOCTOR",
normalized = self._add_dict_branch(normalized, key.split("."), value) merge_enabled=self.config_merge,
core_loaders=["YAML"],
root_path=root_path,
settings_files=self.config_files,
fresh_vars=["base_dir", "output_dir"],
validators=[
Validator(
"base_dir",
default=os.getcwd(),
apply_default_on_none=True,
is_type_of=str,
),
Validator(
"dry_run",
default=False,
is_type_of=bool,
),
Validator(
"recursive",
default=False,
is_type_of=bool,
),
Validator(
"exclude_files",
default=[],
is_type_of=list,
),
Validator(
"exclude_tags",
default=[],
is_type_of=list,
),
Validator(
"role.name",
is_type_of=str,
),
Validator(
"role.autodetect",
default=True,
is_type_of=bool,
),
Validator(
"logging.level",
default="WARNING",
is_in=[
"DEBUG",
"INFO",
"WARNING",
"ERROR",
"CRITICAL",
"debug",
"info",
"warning",
"error",
"critical",
],
),
Validator(
"logging.json",
default=False,
is_type_of=bool,
),
Validator(
"recursive",
default=False,
is_type_of=bool,
),
Validator(
"template.src",
default=f"local>{tmpl_src}",
is_type_of=str,
condition=lambda x: re.match(r"^(local|git)\s*>\s*", x),
messages={
"condition": f"Template provider must be one of {tmpl_provider}.",
},
),
Validator(
"template.name",
default="readme",
is_type_of=str,
),
Validator(
"template.options.tabulate_variables",
default=False,
is_type_of=bool,
),
Validator(
"renderer.autotrim",
default=True,
is_type_of=bool,
),
Validator(
"renderer.include_header",
default="",
is_type_of=str,
),
Validator(
"renderer.dest",
default=os.path.relpath(os.getcwd()),
is_type_of=str,
),
Validator(
"renderer.force_overwrite",
default=False,
is_type_of=bool,
),
],
)
self.validate()
# Override correct log level from argparse # Override correct log level from argparse
levels = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] levels = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
log_level = levels.index(self.SETTINGS["logging.level"]["default"]) log_level = levels.index(self.config.logging.level.upper())
if normalized.get("logging"): if self.args.get("logging.level") and isinstance(self.args["logging.level"], list):
for adjustment in normalized["logging"]["level"]: for lvl in self.args["logging.level"]:
log_level = min(len(levels) - 1, max(log_level + adjustment, 0)) log_level = min(len(levels) - 1, max(log_level + lvl, 0))
normalized["logging"]["level"] = levels[log_level]
return normalized self.args["logging__level"] = levels[log_level]
def _get_defaults(self): if root_path:
normalized = {} self.args["base_dir"] = root_path
for key, item in self.SETTINGS.items():
normalized = self._add_dict_branch(normalized, key.split("."), item["default"])
# compute role_name default self.config.update(self.args)
normalized["role_name"] = os.path.basename(self.role_dir) self.validate()
self.schema = anyconfig.gen_schema(normalized) self._init_logger()
return normalized
def _get_envs(self): def validate(self):
normalized = {}
for key, item in self.SETTINGS.items():
if item.get("env"):
prefix = "ANSIBLE_DOCTOR_"
envname = prefix + item["env"]
try: try:
value = item["type"](envname) self.config.validators.validate_all()
normalized = self._add_dict_branch(normalized, key.split("."), value) except ValidationError as e:
except environs.EnvError as e: raise ansibledoctor.exception.ConfigError("Configuration error", e.message) from e
if '"{}" not set'.format(envname) in str(e):
pass def is_role(self):
else: self.config.role_name = self.config.get(
raise ansibledoctor.exception.ConfigError( "role_name", os.path.basename(self.config.base_dir)
"Unable to read environment variable", str(e)
) )
return os.path.isdir(os.path.join(self.config.base_dir, "tasks"))
return normalized
def _set_config(self):
args = self._get_args(self._args)
envs = self._get_envs()
defaults = self._get_defaults()
# preset config file path
if envs.get("config_file"):
self.config_file = self._normalize_path(envs.get("config_file"))
if envs.get("role_dir"):
self.role_dir = self._normalize_path(envs.get("role_dir"))
if args.get("config_file"):
self.config_file = self._normalize_path(args.get("config_file"))
if args.get("role_dir"):
self.role_dir = self._normalize_path(args.get("role_dir"))
source_files = []
source_files.append(self.config_file)
source_files.append(os.path.join(os.getcwd(), ".ansibledoctor"))
source_files.append(os.path.join(os.getcwd(), ".ansibledoctor.yml"))
source_files.append(os.path.join(os.getcwd(), ".ansibledoctor.yaml"))
for config in source_files:
if config and os.path.exists(config):
with open(config, "r", encoding="utf8") as stream:
s = stream.read()
try:
file_dict = ruamel.yaml.safe_load(s)
except (
ruamel.yaml.composer.ComposerError, ruamel.yaml.scanner.ScannerError
) as e:
message = "{} {}".format(e.context, e.problem)
raise ansibledoctor.exception.ConfigError(
"Unable to read config file {}".format(config), message
)
if self._validate(file_dict):
anyconfig.merge(defaults, file_dict, ac_merge=anyconfig.MS_DICTS)
defaults["logging"]["level"] = defaults["logging"]["level"].upper()
if self._validate(envs):
anyconfig.merge(defaults, envs, ac_merge=anyconfig.MS_DICTS)
if self._validate(args):
anyconfig.merge(defaults, args, ac_merge=anyconfig.MS_DICTS)
fix_files = ["output_dir", "template_dir", "custom_header"]
for file in fix_files:
if defaults[file] and defaults[file] != "":
defaults[file] = self._normalize_path(defaults[file])
if "config_file" in defaults:
defaults.pop("config_file")
if "role_dir" in defaults:
defaults.pop("role_dir")
defaults["logging"]["level"] = defaults["logging"]["level"].upper()
self.config = defaults
def _normalize_path(self, path):
if not os.path.isabs(path):
base = os.path.join(os.getcwd(), path)
return os.path.abspath(os.path.expanduser(os.path.expandvars(base)))
else:
return path
def _set_is_role(self):
if os.path.isdir(os.path.join(self.role_dir, "tasks")):
return True
def _validate(self, config):
try:
anyconfig.validate(config, self.schema, ac_schema_safe=False)
except jsonschema.exceptions.ValidationError as e:
schema_error = "Failed validating '{validator}' in schema{schema}\n{message}".format(
validator=e.validator,
schema=format_as_index(list(e.relative_schema_path)[:-1]),
message=e.message
)
raise ansibledoctor.exception.ConfigError("Configuration error", schema_error)
return True
def _add_dict_branch(self, tree, vector, value):
key = vector[0]
tree[key] = value \
if len(vector) == 1 \
else self._add_dict_branch(tree[key] if key in tree else {}, vector[1:], value)
return tree
def get_annotations_definition(self, automatic=True): def get_annotations_definition(self, automatic=True):
annotations = {} annotations = {}
if automatic: if automatic:
for k, item in self.ANNOTATIONS.items(): for k, item in self.ANNOTATIONS.items():
if "automatic" in item.keys() and item["automatic"]: if item.get("automatic"):
annotations[k] = item annotations[k] = item
return annotations return annotations
@ -305,19 +228,84 @@ class Config():
annotations = [] annotations = []
if automatic: if automatic:
for k, item in self.ANNOTATIONS.items(): for k, item in self.ANNOTATIONS.items():
if "automatic" in item.keys() and item["automatic"]: if item.get("automatic"):
annotations.append(k) annotations.append(k)
return annotations return annotations
def get_template(self): def _init_logger(self):
""" styles = structlog.dev.ConsoleRenderer.get_default_level_styles()
Get the base dir for the template to use. styles["debug"] = colorama.Fore.BLUE
:return: str abs path processors = [
""" structlog.contextvars.merge_contextvars,
template_dir = self.config.get("template_dir") structlog.processors.add_log_level,
template = self.config.get("template") structlog.processors.StackInfoRenderer(),
return os.path.realpath(os.path.join(template_dir, template)) structlog.dev.set_exc_info,
structlog.processors.TimeStamper(fmt="%Y-%m-%d %H:%M:%S", utc=False),
]
if self.config.logging.json:
processors.append(ErrorStringifier())
processors.append(structlog.processors.JSONRenderer())
else:
processors.append(MultilineConsoleRenderer(level_styles=styles))
try:
structlog.configure(
processors=processors,
wrapper_class=structlog.make_filtering_bound_logger(
logging.getLevelName(self.config.get("logging.level")),
),
)
structlog.contextvars.unbind_contextvars()
except KeyError as e:
raise ansibledoctor.exception.ConfigError(f"Can not set log level: {e!s}") from e
class ErrorStringifier:
"""A processor that converts exceptions to a string representation."""
def __call__(self, _, __, event_dict):
if "error" not in event_dict:
return event_dict
err = event_dict.get("error")
if isinstance(err, Exception):
event_dict["error"] = f"{err.__class__.__name__}: {err}"
return event_dict
class MultilineConsoleRenderer(structlog.dev.ConsoleRenderer):
"""A processor for printing multiline strings."""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def __call__(self, _, __, event_dict):
err = None
if "error" in event_dict:
err = event_dict.pop("error")
event_dict = super().__call__(_, __, event_dict)
if not err:
return event_dict
sio = StringIO()
sio.write(event_dict)
if isinstance(err, Exception):
sio.write(
f"\n{colorama.Fore.RED}{err.__class__.__name__}:"
f"{colorama.Style.RESET_ALL} {str(err).strip()}"
)
else:
sio.write(f"\n{err.strip()}")
return sio.getvalue()
class SingleConfig(Config, metaclass=Singleton): class SingleConfig(Config, metaclass=Singleton):

View File

@ -1,146 +1,127 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""Prepare output and write compiled jinja2 templates.""" """Prepare output and write compiled jinja2 templates."""
import glob import json
import ntpath
import os import os
import re import re
from functools import reduce from functools import reduce
import jinja2.exceptions import jinja2.exceptions
import ruamel.yaml import ruamel.yaml
from jinja2 import Environment import structlog
from jinja2 import FileSystemLoader from jinja2 import Environment, FileSystemLoader
from jinja2.filters import evalcontextfilter from jinja2.filters import pass_eval_context
import ansibledoctor.exception
from ansibledoctor.config import SingleConfig from ansibledoctor.config import SingleConfig
from ansibledoctor.utils import FileUtils from ansibledoctor.template import Template
from ansibledoctor.utils import SingleLog from ansibledoctor.utils import FileUtils, sysexit_with_message
class Generator: class Generator:
"""Generate documentation from jinja2 templates.""" """Generate documentation from jinja2 templates."""
def __init__(self, doc_parser): def __init__(self, doc_parser):
self.template_files = [] self.log = structlog.get_logger()
self.extension = "j2"
self._parser = None
self.config = SingleConfig() self.config = SingleConfig()
self.log = SingleLog() self.template = Template(
self.logger = self.log.logger self.config.config.get("template.name"),
self.config.config.get("template.src"),
)
self._parser = doc_parser self._parser = doc_parser
self._scan_template()
def _scan_template(self):
"""
Search for Jinja2 (.j2) files to apply to the destination.
:return: None
"""
template_dir = self.config.get_template()
if os.path.isdir(template_dir):
self.logger.info("Using template dir: {}".format(template_dir))
else:
self.log.sysexit_with_message("Can not open template dir {}".format(template_dir))
for file in glob.iglob(template_dir + "/**/*." + self.extension, recursive=True):
relative_file = file[len(template_dir) + 1:]
if ntpath.basename(file)[:1] != "_":
self.logger.debug("Found template file: " + relative_file)
self.template_files.append(relative_file)
else:
self.logger.debug("Ignoring template file: " + relative_file)
def _create_dir(self, directory): def _create_dir(self, directory):
if not self.config.config["dry_run"] and not os.path.isdir(directory): if not self.config.config["dry_run"] and not os.path.isdir(directory):
try: try:
os.makedirs(directory, exist_ok=True) os.makedirs(directory, exist_ok=True)
self.logger.info("Creating dir: " + directory) self.log.info(f"Creating dir: {directory}")
except FileExistsError as e: except FileExistsError as e:
self.log.sysexit_with_message(str(e)) sysexit_with_message(e)
def _write_doc(self): def _write_doc(self):
files_to_overwite = [] files_to_overwite = []
for file in self.template_files: for tf in self.template.files:
doc_file = os.path.join( doc_file = os.path.join(
self.config.config.get("output_dir"), self.config.config.get("renderer.dest"), os.path.splitext(tf)[0]
os.path.splitext(file)[0]
) )
if os.path.isfile(doc_file): if os.path.isfile(doc_file):
files_to_overwite.append(doc_file) files_to_overwite.append(doc_file)
header_file = self.config.config.get("custom_header") header_file = self.config.config.get("renderer.include_header")
role_data = self._parser.get_data() role_data = self._parser.get_data()
header_content = "" header_content = ""
if bool(header_file): if bool(header_file):
role_data["internal"]["append"] = True role_data["internal"]["append"] = True
try: try:
with open(header_file, "r") as a: with open(header_file) as a:
header_content = a.read() header_content = a.read()
except FileNotFoundError as e: except FileNotFoundError as e:
self.log.sysexit_with_message("Can not open custom header file\n{}".format(str(e))) sysexit_with_message("Can not open custom header file", path=header_file, error=e)
if len(files_to_overwite) > 0 and self.config.config.get("force_overwrite") is False: if (
if not self.config.config["dry_run"]: len(files_to_overwite) > 0
self.logger.warn("This files will be overwritten:") and self.config.config.get("renderer.force_overwrite") is False
print(*files_to_overwite, sep="\n") and not self.config.config["dry_run"]
):
files_to_overwite_string = "\n".join(files_to_overwite)
prompt = f"These files will be overwritten:\n{files_to_overwite_string}".replace(
"\n", "\n... "
)
try: try:
if not FileUtils.query_yes_no("Do you want to continue?"): if not FileUtils.query_yes_no(f"{prompt}\nDo you want to continue?"):
self.log.sysexit_with_message("Aborted...") sysexit_with_message("Aborted...")
except ansibledoctor.exception.InputError as e: except KeyboardInterrupt:
self.logger.debug(str(e)) sysexit_with_message("Aborted...")
self.log.sysexit_with_message("Aborted...")
for file in self.template_files: for tf in self.template.files:
doc_file = os.path.join( doc_file = os.path.join(
self.config.config.get("output_dir"), self.config.config.get("renderer.dest"), os.path.splitext(tf)[0]
os.path.splitext(file)[0]
) )
source_file = self.config.get_template() + "/" + file template = os.path.join(self.template.path, tf)
self.logger.debug("Writing doc output to: " + doc_file + " from: " + source_file) self.log.debug("Writing renderer output", path=doc_file, src=os.path.dirname(template))
# make sure the directory exists # make sure the directory exists
self._create_dir(os.path.dirname(doc_file)) self._create_dir(os.path.dirname(doc_file))
if os.path.exists(source_file) and os.path.isfile(source_file): if os.path.exists(template) and os.path.isfile(template):
with open(source_file, "r") as template: with open(template) as template:
data = template.read() data = template.read()
if data is not None: if data is not None:
try: try:
jenv = Environment( # nosec jenv = Environment( # nosec
loader=FileSystemLoader(self.config.get_template()), loader=FileSystemLoader(self.template.path),
lstrip_blocks=True, lstrip_blocks=True,
trim_blocks=True trim_blocks=True,
autoescape=jinja2.select_autoescape(),
) )
jenv.filters["to_nice_yaml"] = self._to_nice_yaml jenv.filters["to_nice_yaml"] = self._to_nice_yaml
jenv.filters["to_code"] = self._to_code
jenv.filters["deep_get"] = self._deep_get jenv.filters["deep_get"] = self._deep_get
jenv.filters["save_join"] = self._save_join jenv.filters["safe_join"] = self._safe_join
data = jenv.from_string(data).render(role_data, role=role_data) # keep the old name of the function to not break custom templates.
jenv.filters["save_join"] = self._safe_join
template_options = self.config.config.get("template.options")
data = jenv.from_string(data).render(
role_data, role=role_data, options=template_options
)
if not self.config.config["dry_run"]: if not self.config.config["dry_run"]:
with open(doc_file, "wb") as outfile: with open(doc_file, "wb") as outfile:
outfile.write(header_content.encode("utf-8")) outfile.write(header_content.encode("utf-8"))
outfile.write(data.encode("utf-8")) outfile.write(data.encode("utf-8"))
self.logger.info("Writing to: " + doc_file)
else:
self.logger.info("Writing to: " + doc_file)
except ( except (
jinja2.exceptions.UndefinedError, jinja2.exceptions.TemplateSyntaxError jinja2.exceptions.UndefinedError,
jinja2.exceptions.TemplateSyntaxError,
jinja2.exceptions.TemplateRuntimeError,
) as e: ) as e:
self.log.sysexit_with_message( sysexit_with_message(
"Jinja2 templating error while loading file: '{}'\n{}".format( "Jinja2 template error while loading file", path=tf, error=e
file, str(e)
)
) )
except UnicodeEncodeError as e: except UnicodeEncodeError as e:
self.log.sysexit_with_message( sysexit_with_message("Failed to print special characters", error=e)
"Unable to print special characters\n{}".format(str(e))
)
def _to_nice_yaml(self, a, indent=4, *args, **kw): def _to_nice_yaml(self, a, indent=4, **kw):
"""Make verbose, human readable yaml.""" """Make verbose, human readable yaml."""
yaml = ruamel.yaml.YAML() yaml = ruamel.yaml.YAML()
yaml.indent(mapping=indent, sequence=(indent * 2), offset=indent) yaml.indent(mapping=indent, sequence=(indent * 2), offset=indent)
@ -148,22 +129,52 @@ class Generator:
yaml.dump(a, stream, **kw) yaml.dump(a, stream, **kw)
return stream.getvalue().rstrip() return stream.getvalue().rstrip()
def _deep_get(self, _, dictionary, keys, *args, **kw): def _to_code(self, a, to_multiline=False, tab_var=False, preserve_ms=False, lang="plain"):
"""Wrap a string in backticks."""
if a is None or a == "":
return ""
if (isinstance(a, list) and len(a) < 1) or (isinstance(a, dict) and not a):
return ""
if isinstance(a, list) and len(a) > 1 and preserve_ms:
return a
if isinstance(a, list) and len(a) == 1:
return f"`{self._tab_var(a[0], tab_var)}`"
if (isinstance(a, list)) and to_multiline:
return "```" + lang + "\n" + "\n".join(a) + "\n```"
return f"`{self._tab_var(a, tab_var)}`"
def _tab_var(self, a, tab_var):
"""Wrap a string in backticks."""
if not tab_var:
return a
return json.dumps(a)
def _deep_get(self, _, dictionary, keys):
default = None default = None
return reduce( return reduce(
lambda d, key: d.get(key, default) lambda d, key: d.get(key, default) if isinstance(d, dict) else default,
if isinstance(d, dict) else default, keys.split("."), dictionary keys.split("."),
dictionary,
) )
@evalcontextfilter @pass_eval_context
def _save_join(self, eval_ctx, value, d=u"", attribute=None): def _safe_join(self, eval_ctx, value, d=""):
if isinstance(value, str): if isinstance(value, str):
value = [value] value = [value]
joined = jinja2.filters.do_join(eval_ctx, value, d, attribute=None) normalized = jinja2.filters.do_join(eval_ctx, value, d, attribute=None)
nornalized = re.sub(r" +(\n|\t| )", "\\1", joined)
return nornalized if self.config.config.renderer.autotrim:
for s in [r" +(\n|\t| )", r"(\n|\t) +"]:
normalized = re.sub(s, "\\1", normalized)
return jinja2.filters.do_mark_safe(normalized)
def render(self): def render(self):
self.logger.info("Using output dir: " + self.config.config.get("output_dir"))
self._write_doc() self._write_doc()

View File

@ -5,16 +5,15 @@ import fnmatch
from collections import defaultdict from collections import defaultdict
import anyconfig import anyconfig
import ruamel.yaml import structlog
from nested_lookup import nested_lookup
from ansibledoctor.annotation import Annotation from ansibledoctor.annotation import Annotation
from ansibledoctor.config import SingleConfig from ansibledoctor.config import SingleConfig
from ansibledoctor.contstants import YAML_EXTENSIONS from ansibledoctor.contstants import YAML_EXTENSIONS
from ansibledoctor.exception import YAMLError
from ansibledoctor.file_registry import Registry from ansibledoctor.file_registry import Registry
from ansibledoctor.utils import SingleLog from ansibledoctor.utils import flatten, sysexit_with_message
from ansibledoctor.utils import UnsafeTag from ansibledoctor.utils.yamlhelper import parse_yaml, parse_yaml_ansible
from ansibledoctor.utils import flatten
class Parser: class Parser:
@ -24,63 +23,37 @@ class Parser:
self._annotation_objs = {} self._annotation_objs = {}
self._data = defaultdict(dict) self._data = defaultdict(dict)
self.config = SingleConfig() self.config = SingleConfig()
self.log = SingleLog() self.log = structlog.get_logger()
self.logger = SingleLog().logger
self._files_registry = Registry() self._files_registry = Registry()
self._parse_meta_file() self._parse_meta_file()
self._parse_var_files() self._parse_var_files()
self._parse_task_tags() self._parse_task_tags()
self._populate_doc_data() self._populate_doc_data()
def _yaml_remove_comments(self, d):
if isinstance(d, dict):
for k, v in d.items():
self._yaml_remove_comments(k)
self._yaml_remove_comments(v)
elif isinstance(d, list):
for elem in d:
self._yaml_remove_comments(elem)
try:
attr = "comment" if isinstance(
d, ruamel.yaml.scalarstring.ScalarString
) else ruamel.yaml.comments.Comment.attrib
delattr(d, attr)
except AttributeError:
pass
def _parse_var_files(self): def _parse_var_files(self):
for rfile in self._files_registry.get_files(): for rfile in self._files_registry.get_files():
if any(fnmatch.fnmatch(rfile, "*/defaults/*." + ext) for ext in YAML_EXTENSIONS): if any(fnmatch.fnmatch(rfile, "*/defaults/*." + ext) for ext in YAML_EXTENSIONS):
with open(rfile, "r", encoding="utf8") as yaml_file: with open(rfile, encoding="utf8") as yamlfile:
try: try:
ruamel.yaml.add_constructor( raw = parse_yaml(yamlfile)
UnsafeTag.yaml_tag, except YAMLError as e:
UnsafeTag.yaml_constructor, sysexit_with_message("Failed to read yaml file", path=rfile, error=e)
constructor=ruamel.yaml.SafeConstructor
)
raw = ruamel.yaml.YAML(typ="rt").load(yaml_file)
self._yaml_remove_comments(raw)
data = defaultdict(dict, raw or {}) data = defaultdict(dict, raw or {})
for key, value in data.items(): for key, value in data.items():
self._data["var"][key] = {"value": {key: value}} self._data["var"][key] = {"value": {key: value}}
except (
ruamel.yaml.composer.ComposerError, ruamel.yaml.scanner.ScannerError,
ruamel.yaml.constructor.ConstructorError
) as e:
message = "{} {}".format(e.context, e.problem)
self.log.sysexit_with_message(
"Unable to read yaml file {}\n{}".format(rfile, message)
)
def _parse_meta_file(self): def _parse_meta_file(self):
self._data["meta"]["name"] = {"value": self.config.config["role_name"]}
for rfile in self._files_registry.get_files(): for rfile in self._files_registry.get_files():
if any("meta/main." + ext in rfile for ext in YAML_EXTENSIONS): if any("meta/main." + ext in rfile for ext in YAML_EXTENSIONS):
with open(rfile, "r", encoding="utf8") as yaml_file: with open(rfile, encoding="utf8") as yamlfile:
try: try:
raw = ruamel.yaml.YAML(typ="rt").load(yaml_file) raw = parse_yaml(yamlfile)
self._yaml_remove_comments(raw) except YAMLError as e:
sysexit_with_message("Failed to read yaml file", path=rfile, error=e)
data = defaultdict(dict, raw) data = defaultdict(dict, raw)
if data.get("galaxy_info"): if data.get("galaxy_info"):
@ -88,43 +61,35 @@ class Parser:
self._data["meta"][key] = {"value": value} self._data["meta"][key] = {"value": value}
if data.get("dependencies") is not None: if data.get("dependencies") is not None:
self._data["meta"]["dependencies"] = { self._data["meta"]["dependencies"] = {"value": data.get("dependencies")}
"value": data.get("dependencies")
}
self._data["meta"]["name"] = {"value": self.config.config["role_name"]}
except (
ruamel.yaml.composer.ComposerError, ruamel.yaml.scanner.ScannerError
) as e:
message = "{} {}".format(e.context, e.problem)
self.log.sysexit_with_message(
"Unable to read yaml file {}\n{}".format(rfile, message)
)
def _parse_task_tags(self): def _parse_task_tags(self):
for rfile in self._files_registry.get_files(): for rfile in self._files_registry.get_files():
if any(fnmatch.fnmatch(rfile, "*/tasks/*." + ext) for ext in YAML_EXTENSIONS): if any(fnmatch.fnmatch(rfile, "*/tasks/*." + ext) for ext in YAML_EXTENSIONS):
with open(rfile, "r", encoding="utf8") as yaml_file: with open(rfile, encoding="utf8") as yamlfile:
try: try:
raw = ruamel.yaml.YAML(typ="rt").load(yaml_file) raw = parse_yaml_ansible(yamlfile)
self._yaml_remove_comments(raw) except YAMLError as e:
sysexit_with_message("Failed to read yaml file", path=rfile, error=e)
tags = list(set(flatten(nested_lookup("tags", raw)))) tags = []
for tag in tags: for task in raw:
task_tags = task.get("tags", [])
if isinstance(task_tags, str):
task_tags = [task_tags]
for tag in task_tags:
if tag not in self.config.config["exclude_tags"]:
tags.append(tag)
for tag in flatten(tags):
self._data["tag"][tag] = {"value": tag} self._data["tag"][tag] = {"value": tag}
except (
ruamel.yaml.composer.ComposerError, ruamel.yaml.scanner.ScannerError
) as e:
message = "{} {}".format(e.context, e.problem)
self.log.sysexit_with_message(
"Unable to read yaml file {}\n{}".format(rfile, message)
)
def _populate_doc_data(self): def _populate_doc_data(self):
"""Generate the documentation data object.""" """Generate the documentation data object."""
tags = defaultdict(dict) tags = defaultdict(dict)
for annotation in self.config.get_annotations_names(automatic=True): for annotation in self.config.get_annotations_names(automatic=True):
self.logger.info("Finding annotations for: @" + annotation) self.log.info(f"Lookup annotation @{annotation}")
self._annotation_objs[annotation] = Annotation( self._annotation_objs[annotation] = Annotation(
name=annotation, files_registry=self._files_registry name=annotation, files_registry=self._files_registry
) )
@ -133,7 +98,7 @@ class Parser:
try: try:
anyconfig.merge(self._data, tags, ac_merge=anyconfig.MS_DICTS) anyconfig.merge(self._data, tags, ac_merge=anyconfig.MS_DICTS)
except ValueError as e: except ValueError as e:
self.log.sysexit_with_message("Unable to merge annotation values:\n{}".format(e)) sysexit_with_message("Failed to merge annotation values", error=e)
def get_data(self): def get_data(self):
return self._data return self._data

View File

@ -1,22 +1,26 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""Custom exceptions.""" """Doctor exception module."""
class DoctorError(Exception): class DoctorError(Exception):
"""Generic exception class for ansible-doctor.""" """Define generic exception."""
def __init__(self, msg, original_exception=""): def __init__(self, msg, original_exception=""):
super(DoctorError, self).__init__("{msg}\n{org}".format(msg=msg, org=original_exception)) super().__init__(f"{msg}\n{original_exception}")
self.original_exception = original_exception self.original_exception = original_exception
class YAMLError(DoctorError):
"""Errors while reading a yaml file."""
pass
class ConfigError(DoctorError): class ConfigError(DoctorError):
"""Errors related to config file handling.""" """Errors related to config file handling."""
pass pass
class InputError(DoctorError): class TemplateError(DoctorError):
"""Errors related to config file handling.""" """Errors related to template file handling."""
pass

View File

@ -5,10 +5,10 @@ import glob
import os import os
import pathspec import pathspec
import structlog
from ansibledoctor.config import SingleConfig from ansibledoctor.config import SingleConfig
from ansibledoctor.contstants import YAML_EXTENSIONS from ansibledoctor.contstants import YAML_EXTENSIONS
from ansibledoctor.utils import SingleLog
class Registry: class Registry:
@ -21,7 +21,7 @@ class Registry:
def __init__(self): def __init__(self):
self._doc = [] self._doc = []
self.config = SingleConfig() self.config = SingleConfig()
self.log = SingleLog().logger self.log = structlog.get_logger()
self._scan_for_yamls() self._scan_for_yamls()
def get_files(self): def get_files(self):
@ -35,24 +35,17 @@ class Registry:
:return: None :return: None
""" """
extensions = YAML_EXTENSIONS extensions = YAML_EXTENSIONS
role_dir = self.config.role_dir base_dir = self.config.config.base_dir
role_name = os.path.basename(role_dir)
excludes = self.config.config.get("exclude_files") excludes = self.config.config.get("exclude_files")
excludespec = pathspec.PathSpec.from_lines("gitwildmatch", excludes) excludespec = pathspec.PathSpec.from_lines("gitwildmatch", excludes)
self.log.debug("Scan for files: " + role_dir) self.log.debug("Lookup role files", path=base_dir)
for extension in extensions: for extension in extensions:
pattern = os.path.join(role_dir, "**/*." + extension) pattern = os.path.join(base_dir, "**/*." + extension)
for filename in glob.iglob(pattern, recursive=True): for filename in glob.iglob(pattern, recursive=True):
if not excludespec.match_file(filename): if not excludespec.match_file(filename):
self.log.debug( self.log.debug("Found role file", path=os.path.relpath(filename, base_dir))
"Adding file to '{}': {}".format(
role_name, os.path.relpath(filename, role_dir)
)
)
self._doc.append(filename) self._doc.append(filename)
else: else:
self.log.debug( self.log.debug("Skippped role file", path=os.path.relpath(filename, base_dir))
"Excluding file: {}".format(os.path.relpath(filename, role_dir))
)

113
ansibledoctor/template.py Normal file
View File

@ -0,0 +1,113 @@
"""Module for handling templates."""
import atexit
import glob
import ntpath
import os
import shutil
import tempfile
import structlog
from git import GitCommandError, Repo
import ansibledoctor.exception
from ansibledoctor.utils import sysexit_with_message
class Template:
"""
Represents a template that can be used to generate content.
Templates can be sourced from a local file or a Git repository. The `Template` class handles
the initialization and setup of a template, including cloning a Git repository if necessary.
Args:
----
name (str): The name of the template.
src (str): The source of the template, in the format `<provider>><path>`.
Supported providers are `local` and `git`.
Raises:
------
ansibledoctor.exception.TemplateError
"""
def __init__(self, name, src):
self.log = structlog.get_logger()
self.name = name
self.src = src
try:
provider, path = self.src.split(">", 1)
except ValueError as e:
raise ansibledoctor.exception.TemplateError(
"Error reading template src", str(e)
) from e
self.provider = provider.strip().lower()
self.path = path.strip()
if self.provider == "local":
self.path = os.path.realpath(os.path.join(self.path, self.name))
elif self.provider == "git":
repo_url, branch_or_tag = (
self.path.split("#", 1) if "#" in self.path else (self.path, None)
)
temp_dir = self._clone_repo(repo_url, branch_or_tag)
self.path = os.path.join(temp_dir, self.name)
else:
raise ansibledoctor.exception.TemplateError(
f"Unsupported template provider: {provider}"
)
self.files = self._scan_files()
def _clone_repo(self, repo_url, branch_or_tag=None):
temp_dir = tempfile.mkdtemp(prefix="ansibledoctor-")
atexit.register(self._cleanup_temp_dir, temp_dir)
try:
self.log.debug("Cloning template repo", src=repo_url)
repo = Repo.clone_from(repo_url, temp_dir)
if branch_or_tag:
self.log.debug(f"Checking out branch or tag: {branch_or_tag}")
try:
repo.git.checkout(branch_or_tag)
except GitCommandError as e:
raise ansibledoctor.exception.TemplateError(
f"Error checking out branch or tag: {branch_or_tag}: {e}"
) from e
return temp_dir
except GitCommandError as e:
msg = e.stderr.strip("'").strip()
msg = msg.removeprefix("stderr: ")
raise ansibledoctor.exception.TemplateError(
f"Error cloning Git repository: {msg}"
) from e
def _scan_files(self):
"""Search for Jinja2 (.j2) files to apply to the destination."""
template_files = []
if os.path.isdir(self.path):
self.log.info("Lookup template files", src=self.src)
else:
sysexit_with_message("Can not open template directory", path=self.path)
for file in glob.iglob(self.path + "/**/*.j2", recursive=True):
relative_file = file[len(self.path) + 1 :]
if ntpath.basename(file)[:1] != "_":
self.log.debug("Found template file", path=relative_file)
template_files.append(relative_file)
else:
self.log.debug("Skipped template file", path=relative_file)
return template_files
@staticmethod
def _cleanup_temp_dir(temp_dir):
if temp_dir and os.path.exists(temp_dir):
shutil.rmtree(temp_dir)

View File

@ -0,0 +1,7 @@
## Requirements
{% if meta | deep_get(meta, "min_ansible_version.value") %}
- Minimum Ansible version: `{{ meta.min_ansible_version.value }}`
{% else %}
None.
{% endif %}

View File

@ -4,8 +4,8 @@
{% for key, item in tag | dictsort %} {% for key, item in tag | dictsort %}
{{ key }} {{ key }}
{% if item.description is defined and item.description | save_join(" ") | striptags %} {% if item.description is defined and item.description | safe_join(" ") | striptags %}
: {{ item.description | save_join(" ") | striptags }} : {{ item.description | safe_join(" ") | striptags }}
{% else %} {% else %}
: &nbsp; : &nbsp;
{% endif %} {% endif %}

View File

@ -1,10 +1,13 @@
- [Requirements](#requirements)
{% set var = role.var | default({}) %} {% set var = role.var | default({}) %}
{% if var %} {% if var %}
- [Default Variables](#default-variables) - [Default Variables](#default-variables)
{% if not options.tabulate_vars %}
{% for key, item in var | dictsort %} {% for key, item in var | dictsort %}
- [{{ key }}](#{{ key }}) - [{{ key }}](#{{ key }})
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% endif %}
{% if tag %} {% if tag %}
- [Discovered Tags](#discovered-tags) - [Discovered Tags](#discovered-tags)
{% endif %} {% endif %}

View File

@ -4,15 +4,15 @@
{% for key, item in todo | dictsort %} {% for key, item in todo | dictsort %}
{% for line in item %} {% for line in item %}
{% if line.value is defined and line.value | save_join(" ") | striptags and key == "default" %} {% if line.value is defined and line.value | safe_join(" ") | striptags and key == "default" %}
- {{ line.value | save_join(" ") | striptags }} - {{ line.value | safe_join(" ") | striptags }}
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}
{% for key, item in todo | dictsort %} {% for key, item in todo | dictsort %}
{% for line in item %} {% for line in item %}
{% if line.value is defined and line.value | save_join(" ") | striptags and key != "default" %} {% if line.value is defined and line.value | safe_join(" ") | striptags and key != "default" %}
- ({{ key }}): {{ line.value | save_join(" ") | striptags }} - ({{ key }}): {{ line.value | safe_join(" ") | striptags }}
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}

View File

@ -1,13 +1,29 @@
{% set var = role.var | default({}) %} {% set var = role.var | default({}) %}
{% if var %} {% if var %}
## Default Variables ## Default Variables
{% for key, item in var | dictsort %} {% for key, item in var | dictsort %}
### {{ key }} ### {{ key }}
{% if item.description is defined and item.description %} {% if item.description is defined and item.description %}
{% set description = [item.description] if item.description is string else item.description %}
{{ item.description | save_join(" ") }} {{ description | map("replace", "\n\n", "\n") | safe_join("\n") }}
{% endif %}
{% if item.deprecated is defined or item.type is defined %}
{% if item.deprecated is defined %}
{% set deprecated = [item.deprecated] if item.deprecated is string else item.deprecated %}
{% set deprecated_string = deprecated | map("replace", "\n\n", "\n") | safe_join("\n") %}
{% if deprecated_string %}
**_Deprecated:_** {{ deprecated_string }}<br />
{% else %}
**_Deprecated_**<br />
{% endif %}
{% endif %}
{% if item.type is defined and item.type %}
{% set type = [item.type] if item.type is string else item.type %}
**_Type:_** {{ type | map("replace", "\n\n", "\n") | safe_join("\n") }}<br />
{% endif %}
{% endif %} {% endif %}
{% if item.value is defined and item.value %} {% if item.value is defined and item.value %}

View File

@ -0,0 +1,49 @@
{% set var = role.var | default({}) %}
{% if var %}
## Default Variables
{% set columns = ["variable", "default", "description", "type", "deprecated", "example"] %}
{% set found_columns = ["variable", "default"] + var.values() | map("list") | sum(start=["key"]) | unique | list %}
{% for c in columns %}
{% if c in found_columns %}
|{{ c | capitalize -}}
{% endif %}
{% endfor %}
|
{% for c in columns %}
{% if c in found_columns %}
|{{ "-" * (c | length) -}}
{% endif %}
{% endfor %}
|
{% for key, item in var | dictsort %}
|{{ key | to_code -}}
|{{ (item.value | default({}))[key] | default | to_code -}}
{% if "description" in found_columns %}
|{{ item.description | default([]) | safe_join("<br />") | replace("\n", "<br />") | replace("|", "\|") -}}
{% endif %}
{% if "type" in found_columns %}
|{{ item.type | default([]) | to_code(skip_list_len=1) | safe_join("<br />") -}}
{% endif %}
{% if "deprecated" in found_columns %}
|
{%- if "deprecated" in found_columns %}
{% if item.deprecated is defined %}
{% set deprecated = [item.deprecated] if item.deprecated is string else item.deprecated %}
{% set deprecated_string = deprecated | map("replace", "\n", "<br />") | safe_join("<br />") %}
{% if deprecated_string -%}
{{ deprecated_string }}
{%- else -%}
True
{%- endif %}
{%- else -%}
False
{%- endif %}
{% endif %}
{% endif %}
{% if "example" in found_columns %}
|{{ item.example | default([]) | to_code(skip_list_len=1) | safe_join("<br />") | replace("\n", "<br />") | replace("|", "\|") -}}
{% endif %}
|
{% endfor %}
{% endif %}

View File

@ -1,22 +1,35 @@
{% if not append | deep_get(role, "internal.append") %} {% if not append | deep_get(role, "internal.append") %}
{% set meta = role.meta | default({}) %} {% set meta = role.meta | default({}) %}
--- ---
title: {{ meta.name.value | save_join(" ") }} title: {{ meta.name.value | safe_join(" ") }}
type: docs type: docs
{% if summary | deep_get(meta, "summary.value") %}
summary: {{ meta.summary.value | safe_join(" ") }}
{% endif %}
--- ---
{% endif %} {% endif %}
{% if description | deep_get(meta, "description.value") %} {% if description | deep_get(meta, "description.value") %}
{% set description = [meta.description.value] if meta.description.value is string else meta.description.value %}
{{ meta.description.value | save_join(" ") }} {{ description | map("replace", "\n\n", "\n") | safe_join("\n") }}
{% endif %} {% endif %}
<!--more-->
{# TOC #} {# TOC #}
{% include '_toc.j2' %} {% include '_toc.j2' +%}
{# Requirements #}
{% include '_requirements.j2' %}
{# Vars #} {# Vars #}
{% if options.tabulate_vars %}
{% include '_vars_tabulated.j2' %}
{% else %}
{% include '_vars.j2' %} {% include '_vars.j2' %}
{% endif %}
{# Todo #} {# Tag #}
{% include '_tag.j2' %} {% include '_tag.j2' %}
{# Todo #} {# Todo #}

View File

@ -1,19 +1,27 @@
{% if not append | deep_get(role, "internal.append") %} {% if not append | deep_get(role, "internal.append") %}
{% set meta = role.meta | default({}) %} {% set meta = role.meta | default({}) %}
# {{ meta.name.value | save_join(" ") }} # {{ meta.name.value | safe_join(" ") }}
{% endif %} {% endif %}
{% if description | deep_get(meta, "description.value") %} {% if description | deep_get(meta, "description.value") %}
{% set description = [meta.description.value] if meta.description.value is string else meta.description.value %}
{{ meta.description.value | save_join(" ") }} {{ description | map("replace", "\n\n", "\n") | safe_join("\n") }}
{% endif %} {% endif %}
{# TOC #} {# TOC #}
{% include '_toc.j2' %} {% include '_toc.j2' +%}
{# Requirements #}
{% include '_requirements.j2' %}
{# Vars #} {# Vars #}
{% if options.tabulate_vars %}
{% include '_vars_tabulated.j2' %}
{% else %}
{% include '_vars.j2' %} {% include '_vars.j2' %}
{% endif %}
{# Todo #} {# Tag #}
{% include '_tag.j2' %} {% include '_tag.j2' %}
{# Todo #} {# Todo #}

View File

@ -9,7 +9,9 @@
{% set deps = meta.dependencies.value %} {% set deps = meta.dependencies.value %}
{% endif %} {% endif %}
{% for item in deps %} {% for item in deps %}
- {{ item }} {% if item is string or item.role %}
- {{ item if item is string else item.role }}
{% endif %}
{% endfor %} {% endfor %}
{% else %} {% else %}
None. None.
@ -18,12 +20,12 @@ None.
## License ## License
{{ meta.license.value }} {{ meta.license.value | safe_join(" ") }}
{% endif %} {% endif %}
{% if author | deep_get(meta, "author.value") %} {% if author | deep_get(meta, "author.value") %}
## Author ## Author
{{ meta.author.value | save_join(" ") }} {{ meta.author.value | safe_join(" ") }}
{% endif %} {% endif %}
{% endif %} {% endif %}

View File

@ -0,0 +1,7 @@
## Requirements
{% if meta | deep_get(meta, "min_ansible_version.value") %}
- Minimum Ansible version: `{{ meta.min_ansible_version.value }}`
{% else %}
None.
{% endif %}

View File

@ -2,11 +2,11 @@
{% if tag %} {% if tag %}
## Discovered Tags ## Discovered Tags
{% for key, item in tag | dictsort %} {% for key, item in tag | dictsort %}
{% set is_desc = item.description is defined and item.description | save_join(" ") | striptags %} {% set is_desc = item.description is defined and item.description | safe_join(" ") | striptags %}
**_{{ key }}_**{{ "\\" if is_desc else "" }} **_{{ key }}_**{{ "\\" if is_desc else "" }}
{% if is_desc %} {% if is_desc %}
&emsp;{{ item.description | save_join(" ") | striptags }} &emsp;{{ item.description | safe_join(" ") | striptags }}
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% endif %} {% endif %}

View File

@ -1,12 +1,15 @@
## Table of content ## Table of content
- [Requirements](#requirements)
{% set var = role.var | default({}) %} {% set var = role.var | default({}) %}
{% if var %} {% if var %}
- [Default Variables](#default-variables) - [Default Variables](#default-variables)
{% if not options.tabulate_vars %}
{% for key, item in var | dictsort %} {% for key, item in var | dictsort %}
- [{{ key }}](#{{ key }}) - [{{ key }}](#{{ key }})
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% endif %}
{% if tag %} {% if tag %}
- [Discovered Tags](#discovered-tags) - [Discovered Tags](#discovered-tags)
{% endif %} {% endif %}

View File

@ -4,15 +4,15 @@
{% for key, item in todo | dictsort %} {% for key, item in todo | dictsort %}
{% for line in item %} {% for line in item %}
{% if line.value is defined and line.value | save_join(" ") | striptags and key == "default" %} {% if line.value is defined and line.value | safe_join(" ") | striptags and key == "default" %}
- {{ line.value | save_join(" ") | striptags }} - {{ line.value | safe_join(" ") | striptags }}
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}
{% for key, item in todo | dictsort %} {% for key, item in todo | dictsort %}
{% for line in item %} {% for line in item %}
{% if line.value is defined and line.value | save_join(" ") | striptags and key != "default" %} {% if line.value is defined and line.value | safe_join(" ") | striptags and key != "default" %}
- ({{ key }}): {{ line.value | save_join(" ") | striptags }} - ({{ key }}): {{ line.value | safe_join(" ") | striptags }}
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}

View File

@ -1,13 +1,29 @@
{% set var = role.var | default({}) %} {% set var = role.var | default({}) %}
{% if var %} {% if var %}
## Default Variables ## Default Variables
{% for key, item in var | dictsort %} {% for key, item in var | dictsort %}
### {{ key }} ### {{ key }}
{% if item.description is defined and item.description %} {% if item.description is defined and item.description %}
{% set description = [item.description] if item.description is string else item.description %}
{{ item.description | save_join(" ") }} {{ description | map("replace", "\n\n", "\n") | safe_join("\n") }}
{% endif %}
{% if item.deprecated is defined or item.type is defined %}
{% if item.deprecated is defined %}
{% set deprecated = [item.deprecated] if item.deprecated is string else item.deprecated %}
{% set deprecated_string = deprecated | map("replace", "\n\n", "\n") | safe_join("\n") %}
{% if deprecated_string %}
**_Deprecated:_** {{ deprecated_string }}<br />
{% else %}
**_Deprecated_**<br />
{% endif %}
{% endif %}
{% if item.type is defined and item.type %}
{% set type = [item.type] if item.type is string else item.type %}
**_Type:_** {{ type | map("replace", "\n\n", "\n") | safe_join("\n") }}<br />
{% endif %}
{% endif %} {% endif %}
{% if item.value is defined and item.value %} {% if item.value is defined and item.value %}

View File

@ -0,0 +1,49 @@
{% set var = role.var | default({}) %}
{% if var %}
## Default Variables
{% set columns = ["variable", "default", "description", "type", "deprecated", "example"] %}
{% set found_columns = ["variable", "default"] + var.values() | map("list") | sum(start=["key"]) | unique | list %}
{% for c in columns %}
{% if c in found_columns %}
|{{ c | capitalize -}}
{% endif %}
{% endfor %}
|
{% for c in columns %}
{% if c in found_columns %}
|{{ "-" * (c | length) -}}
{% endif %}
{% endfor %}
|
{% for key, item in var | dictsort %}
|{{ key | to_code -}}
|{{ (item.value | default({}))[key] | default | to_code(tab_var=true) -}}
{% if "description" in found_columns %}
|{{ item.description | default([]) | safe_join("<br />") | replace("\n", "<br />") | replace("|", "\|") -}}
{% endif %}
{% if "type" in found_columns %}
|{{ item.type | default([]) | to_code(preserve_ms=true) | safe_join("<br />") -}}
{% endif %}
{% if "deprecated" in found_columns %}
|
{%- if "deprecated" in found_columns %}
{% if item.deprecated is defined %}
{% set deprecated = [item.deprecated] if item.deprecated is string else item.deprecated %}
{% set deprecated_string = deprecated | map("replace", "\n", "<br />") | safe_join("<br />") %}
{% if deprecated_string -%}
{{ deprecated_string }}
{%- else -%}
True
{%- endif %}
{%- else -%}
False
{%- endif %}
{% endif %}
{% endif %}
{% if "example" in found_columns %}
|{{ item.example | default([]) | to_code(tab_var=true,preserve_ms=true) | safe_join("<br />") | replace("\n", "<br />") | replace("|", "\|") -}}
{% endif %}
|
{% endfor %}
{% endif %}

View File

@ -1,289 +0,0 @@
#!/usr/bin/env python3
"""Global utility methods and classes."""
import logging
import os
import sys
from distutils.util import strtobool
import colorama
from pythonjsonlogger import jsonlogger
try:
from typing import Iterable
except ImportError:
from collections import Iterable
import ansibledoctor.exception
CONSOLE_FORMAT = "{}{}[%(levelname)s]{} %(message)s"
JSON_FORMAT = "%(asctime)s %(levelname)s %(message)s"
def to_bool(string):
return bool(strtobool(str(string)))
def flatten(items):
for x in items:
if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
for sub_x in flatten(x):
yield sub_x
else:
yield x
def _should_do_markup():
py_colors = os.environ.get("PY_COLORS", None)
if py_colors is not None:
return to_bool(py_colors)
return sys.stdout.isatty() and os.environ.get("TERM") != "dumb"
colorama.init(autoreset=True, strip=not _should_do_markup())
class Singleton(type):
"""Meta singleton class."""
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class LogFilter(object):
"""A custom log filter which excludes log messages above the logged level."""
def __init__(self, level):
"""
Initialize a new custom log filter.
:param level: Log level limit
:returns: None
"""
self.__level = level
def filter(self, logRecord): # noqa
# https://docs.python.org/3/library/logging.html#logrecord-attributes
return logRecord.levelno <= self.__level
class MultilineFormatter(logging.Formatter):
"""Logging Formatter to reset color after newline characters."""
def format(self, record): # noqa
record.msg = record.msg.replace("\n", "\n{}... ".format(colorama.Style.RESET_ALL))
return logging.Formatter.format(self, record)
class MultilineJsonFormatter(jsonlogger.JsonFormatter):
"""Logging Formatter to remove newline characters."""
def format(self, record): # noqa
record.msg = record.msg.replace("\n", " ")
return jsonlogger.JsonFormatter.format(self, record)
class Log:
"""Handle logging."""
def __init__(self, level=logging.WARN, name="ansibledoctor", json=False):
self.logger = logging.getLogger(name)
self.logger.setLevel(level)
self.logger.addHandler(self._get_error_handler(json=json))
self.logger.addHandler(self._get_warn_handler(json=json))
self.logger.addHandler(self._get_info_handler(json=json))
self.logger.addHandler(self._get_critical_handler(json=json))
self.logger.addHandler(self._get_debug_handler(json=json))
self.logger.propagate = False
def _get_error_handler(self, json=False):
handler = logging.StreamHandler(sys.stderr)
handler.setLevel(logging.ERROR)
handler.addFilter(LogFilter(logging.ERROR))
handler.setFormatter(
MultilineFormatter(
self.error(
CONSOLE_FORMAT.format(
colorama.Fore.RED, colorama.Style.BRIGHT, colorama.Style.RESET_ALL
)
)
)
)
if json:
handler.setFormatter(MultilineJsonFormatter(JSON_FORMAT))
return handler
def _get_warn_handler(self, json=False):
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.WARN)
handler.addFilter(LogFilter(logging.WARN))
handler.setFormatter(
MultilineFormatter(
self.warn(
CONSOLE_FORMAT.format(
colorama.Fore.YELLOW, colorama.Style.BRIGHT, colorama.Style.RESET_ALL
)
)
)
)
if json:
handler.setFormatter(MultilineJsonFormatter(JSON_FORMAT))
return handler
def _get_info_handler(self, json=False):
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.INFO)
handler.addFilter(LogFilter(logging.INFO))
handler.setFormatter(
MultilineFormatter(
self.info(
CONSOLE_FORMAT.format(
colorama.Fore.CYAN, colorama.Style.BRIGHT, colorama.Style.RESET_ALL
)
)
)
)
if json:
handler.setFormatter(MultilineJsonFormatter(JSON_FORMAT))
return handler
def _get_critical_handler(self, json=False):
handler = logging.StreamHandler(sys.stderr)
handler.setLevel(logging.CRITICAL)
handler.addFilter(LogFilter(logging.CRITICAL))
handler.setFormatter(
MultilineFormatter(
self.critical(
CONSOLE_FORMAT.format(
colorama.Fore.RED, colorama.Style.BRIGHT, colorama.Style.RESET_ALL
)
)
)
)
if json:
handler.setFormatter(MultilineJsonFormatter(JSON_FORMAT))
return handler
def _get_debug_handler(self, json=False):
handler = logging.StreamHandler(sys.stderr)
handler.setLevel(logging.DEBUG)
handler.addFilter(LogFilter(logging.DEBUG))
handler.setFormatter(
MultilineFormatter(
self.critical(
CONSOLE_FORMAT.format(
colorama.Fore.BLUE, colorama.Style.BRIGHT, colorama.Style.RESET_ALL
)
)
)
)
if json:
handler.setFormatter(MultilineJsonFormatter(JSON_FORMAT))
return handler
def set_level(self, s):
self.logger.setLevel(s)
def debug(self, msg):
"""Format info messages and return string."""
return msg
def critical(self, msg):
"""Format critical messages and return string."""
return msg
def error(self, msg):
"""Format error messages and return string."""
return msg
def warn(self, msg):
"""Format warn messages and return string."""
return msg
def info(self, msg):
"""Format info messages and return string."""
return msg
def _color_text(self, color, msg):
"""
Colorize strings.
:param color: colorama color settings
:param msg: string to colorize
:returns: string
"""
return "{}{}{}".format(color, msg, colorama.Style.RESET_ALL)
def sysexit(self, code=1):
sys.exit(code)
def sysexit_with_message(self, msg, code=1):
self.logger.critical(str(msg))
self.sysexit(code)
class SingleLog(Log, metaclass=Singleton):
"""Singleton logging class."""
pass
class UnsafeTag:
"""Handle custom yaml unsafe tag."""
yaml_tag = u"!unsafe"
def __init__(self, value):
self.unsafe = value
@staticmethod
def yaml_constructor(loader, node):
return loader.construct_scalar(node)
class FileUtils:
"""Mics static methods for file handling."""
@staticmethod
def create_path(path):
os.makedirs(path, exist_ok=True)
@staticmethod
def query_yes_no(question, default=True):
"""Ask a yes/no question via input() and return their answer.
"question" is a string that is presented to the user.
"default" is the presumed answer if the user just hits <Enter>.
It must be "yes" (the default), "no" or None (meaning
an answer is required of the user).
The "answer" return value is one of "yes" or "no".
"""
if default:
prompt = "[Y/n]"
else:
prompt = "[N/y]"
try:
# input method is safe in python3
choice = input("{} {} ".format(question, prompt)) or default # nosec
return to_bool(choice)
except (KeyboardInterrupt, ValueError) as e:
raise ansibledoctor.exception.InputError("Error while reading input", e)

View File

@ -0,0 +1,130 @@
#!/usr/bin/env python3
"""Global utility methods and classes."""
import os
import sys
from collections.abc import Iterable
import structlog
def strtobool(value):
"""Convert a string representation of truth to true or false."""
_map = {
"y": True,
"yes": True,
"t": True,
"true": True,
"on": True,
"1": True,
"n": False,
"no": False,
"f": False,
"false": False,
"off": False,
"0": False,
}
try:
return _map[str(value).lower()]
except KeyError as err:
raise ValueError(f'"{value}" is not a valid bool value') from err
def to_bool(string):
return bool(strtobool(str(string)))
def flatten(items):
for x in items:
if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
yield from flatten(x)
else:
yield x
def _split_string(string, delimiter, escape, maxsplit=None):
result = []
current_element = []
iterator = iter(string)
count_split = 0
skip_split = False
for character in iterator:
if maxsplit and count_split >= maxsplit:
skip_split = True
if character == escape and not skip_split:
try:
next_character = next(iterator)
if next_character != delimiter and next_character != escape:
# Do not copy the escape character if it is intended to escape either the
# delimiter or the escape character itself. Copy the escape character
# if it is not used to escape either of these characters.
current_element.append(escape)
current_element.append(next_character)
count_split += 1
except StopIteration:
current_element.append(escape)
elif character == delimiter and not skip_split:
result.append("".join(current_element))
current_element = []
count_split += 1
else:
current_element.append(character)
result.append("".join(current_element))
return result
def sysexit(code=1):
sys.exit(code)
def sysexit_with_message(msg, code=1, **kwargs):
structlog.get_logger().critical(str(msg).strip(), **kwargs)
sysexit(code)
class Singleton(type):
"""Meta singleton class."""
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls]
class FileUtils:
"""Mics static methods for file handling."""
@staticmethod
def create_path(path):
os.makedirs(path, exist_ok=True)
@staticmethod
def query_yes_no(question, default=True):
"""
Ask a yes/no question via input() and return their answer.
"question" is a string that is presented to the user.
"default" is the presumed answer if the user just hits <Enter>.
It must be "yes" (the default), "no" or None (meaning
an answer is required of the user).
The "answer" return value is one of "yes" or "no".
"""
prompt = "[Y/n]" if default else "[N/y]"
while True:
try:
# input method is safe in python3
choice = input(f"{question} {prompt} ") or default # nosec
return to_bool(choice)
except ValueError:
print("Invalid input. Please enter 'y' or 'n'.") # noqa: T201
except KeyboardInterrupt as e:
raise e

View File

@ -0,0 +1,78 @@
"""Utils for YAML file operations."""
from collections import defaultdict
from contextlib import suppress
import ruamel.yaml
import yaml
from ansible.parsing.yaml.loader import AnsibleLoader
import ansibledoctor.exception
class UnsafeTag:
"""Handle custom yaml unsafe tag."""
yaml_tag = "!unsafe"
def __init__(self, value):
self.unsafe = value
@staticmethod
def yaml_constructor(loader, node):
return loader.construct_scalar(node)
def parse_yaml_ansible(yamlfile):
try:
loader = AnsibleLoader(yamlfile)
data = loader.get_single_data() or []
except (
yaml.parser.ParserError,
yaml.scanner.ScannerError,
yaml.constructor.ConstructorError,
yaml.composer.ComposerError,
) as e:
raise ansibledoctor.exception.YAMLError(e) from e
return data
def parse_yaml(yamlfile):
try:
ruamel.yaml.add_constructor(
UnsafeTag.yaml_tag,
UnsafeTag.yaml_constructor,
constructor=ruamel.yaml.SafeConstructor,
)
data = ruamel.yaml.YAML(typ="rt").load(yamlfile)
_yaml_remove_comments(data)
data = defaultdict(dict, data or {})
except (
ruamel.yaml.parser.ParserError,
ruamel.yaml.scanner.ScannerError,
ruamel.yaml.constructor.ConstructorError,
ruamel.yaml.composer.ComposerError,
) as e:
raise ansibledoctor.exception.YAMLError(e) from e
return data
def _yaml_remove_comments(d):
if isinstance(d, dict):
for k, v in d.items():
_yaml_remove_comments(k)
_yaml_remove_comments(v)
elif isinstance(d, list):
for elem in d:
_yaml_remove_comments(elem)
with suppress(AttributeError):
attr = (
"comment"
if isinstance(d, ruamel.yaml.scalarstring.ScalarString)
else ruamel.yaml.comments.Comment.attrib
)
delattr(d, attr)

View File

@ -1,24 +0,0 @@
FROM arm32v7/python:3.10-alpine@sha256:9871be3035a0832069bdb8fb5c486025af6d0c0a77e1111bbc1807f638a5e2b6
LABEL maintainer="Robert Kaussow <mail@thegeeklab.de>"
LABEL org.opencontainers.image.authors="Robert Kaussow <mail@thegeeklab.de>"
LABEL org.opencontainers.image.title="ansible-doctor"
LABEL org.opencontainers.image.url="https://ansible-doctor.geekdocs.de/"
LABEL org.opencontainers.image.source="https://github.com/thegeeklab/ansible-doctor"
LABEL org.opencontainers.image.documentation="https://ansible-doctor.geekdocs.de/"
ENV PY_COLORS=1
ENV TZ=UTC
ADD dist/ansible_doctor-*.whl /
RUN apk --update add --virtual .build-deps build-base libffi-dev openssl-dev && \
pip install --upgrade --no-cache-dir pip && \
pip install --no-cache-dir $(find / -name "ansible_doctor-*.whl") && \
rm -f ansible_doctor-*.whl && \
rm -rf /var/cache/apk/* && \
rm -rf /root/.cache/
USER root
CMD []
ENTRYPOINT ["/usr/local/bin/ansible-doctor"]

View File

@ -1,24 +0,0 @@
FROM arm64v8/python:3.10-alpine@sha256:5fae85eea1d49fa7e0b60ab7091922329d1f573a3359f9dc438ac0614169c22a
LABEL maintainer="Robert Kaussow <mail@thegeeklab.de>"
LABEL org.opencontainers.image.authors="Robert Kaussow <mail@thegeeklab.de>"
LABEL org.opencontainers.image.title="ansible-doctor"
LABEL org.opencontainers.image.url="https://ansible-doctor.geekdocs.de/"
LABEL org.opencontainers.image.source="https://github.com/thegeeklab/ansible-doctor"
LABEL org.opencontainers.image.documentation="https://ansible-doctor.geekdocs.de/"
ENV PY_COLORS=1
ENV TZ=UTC
ADD dist/ansible_doctor-*.whl /
RUN apk --update add --virtual .build-deps build-base libffi-dev openssl-dev && \
pip install --upgrade --no-cache-dir pip && \
pip install --no-cache-dir $(find / -name "ansible_doctor-*.whl") && \
rm -f ansible_doctor-*.whl && \
rm -rf /var/cache/apk/* && \
rm -rf /root/.cache/
USER root
CMD []
ENTRYPOINT ["/usr/local/bin/ansible-doctor"]

View File

@ -1,24 +0,0 @@
image: quay.io/thegeeklab/ansible-doctor:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}}
{{#if build.tags}}
tags:
{{#each build.tags}}
- {{this}}
{{/each}}
{{/if}}
manifests:
- image: quay.io/thegeeklab/ansible-doctor:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}amd64
platform:
architecture: amd64
os: linux
- image: quay.io/thegeeklab/ansible-doctor:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm64
platform:
architecture: arm64
os: linux
variant: v8
- image: quay.io/thegeeklab/ansible-doctor:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm
platform:
architecture: arm
os: linux
variant: v7

View File

@ -1,24 +0,0 @@
image: thegeeklab/ansible-doctor:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}}
{{#if build.tags}}
tags:
{{#each build.tags}}
- {{this}}
{{/each}}
{{/if}}
manifests:
- image: thegeeklab/ansible-doctor:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}amd64
platform:
architecture: amd64
os: linux
- image: thegeeklab/ansible-doctor:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm64
platform:
architecture: arm64
os: linux
variant: v8
- image: thegeeklab/ansible-doctor:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm
platform:
architecture: arm
os: linux
variant: v7

View File

@ -2,7 +2,7 @@
title: Documentation title: Documentation
--- ---
[![Build Status](https://img.shields.io/drone/build/thegeeklab/ansible-doctor?logo=drone&server=https%3A%2F%2Fdrone.thegeeklab.de)](https://drone.thegeeklab.de/thegeeklab/ansible-doctor) [![Build Status](https://ci.thegeeklab.de/api/badges/thegeeklab/ansible-doctor/status.svg)](https://ci.thegeeklab.de/repos/thegeeklab/ansible-doctor)
[![Docker Hub](https://img.shields.io/badge/dockerhub-latest-blue.svg?logo=docker&logoColor=white)](https://hub.docker.com/r/thegeeklab/ansible-doctor) [![Docker Hub](https://img.shields.io/badge/dockerhub-latest-blue.svg?logo=docker&logoColor=white)](https://hub.docker.com/r/thegeeklab/ansible-doctor)
[![Quay.io](https://img.shields.io/badge/quay-latest-blue.svg?logo=docker&logoColor=white)](https://quay.io/repository/thegeeklab/ansible-doctor) [![Quay.io](https://img.shields.io/badge/quay-latest-blue.svg?logo=docker&logoColor=white)](https://quay.io/repository/thegeeklab/ansible-doctor)
[![Python Version](https://img.shields.io/pypi/pyversions/ansible-doctor.svg)](https://pypi.org/project/ansible-doctor/) [![Python Version](https://img.shields.io/pypi/pyversions/ansible-doctor.svg)](https://pypi.org/project/ansible-doctor/)

View File

@ -4,10 +4,9 @@ title: Using docker
```Shell ```Shell
docker run \ docker run \
-e ANSIBLE_DOCTOR_ROLE_DIR=example/demo-role/ \ -e ANSIBLE_DOCTOR_BASE_DIR=example/demo-role/ \
-e ANSIBLE_DOCTOR_OUTPUT_DIR=example/ \
-e ANSIBLE_DOCTOR_FORCE_OVERWRITE=true \ -e ANSIBLE_DOCTOR_FORCE_OVERWRITE=true \
-e ANSIBLE_DOCTOR_CUSTOM_HEADER=example/demo-role/HEADER.md \ -e ANSIBLE_DOCTOR_CUSTOM_HEADER=HEADER.md \
-e ANSIBLE_DOCTOR_LOG_LEVEL=info \ -e ANSIBLE_DOCTOR_LOG_LEVEL=info \
-e PY_COLORS=1 \ -e PY_COLORS=1 \
-v $(pwd):/doctor \ -v $(pwd):/doctor \
@ -15,7 +14,6 @@ docker run \
thegeeklab/ansible-doctor thegeeklab/ansible-doctor
``` ```
{{< hint info >}} {{< hint type=note >}}
**Info**\
Keep in mind, that SELinux labels (`:Z` or `:z`) need to be passed as mount option on SELinux enabled systems. Keep in mind, that SELinux labels (`:Z` or `:z`) need to be passed as mount option on SELinux enabled systems.
{{< /hint >}} {{< /hint >}}

View File

@ -4,11 +4,12 @@ title: Using pip
```Shell ```Shell
# From PyPI as unprivileged user # From PyPI as unprivileged user
$ pip install ansible-doctor --user $ pip install ansible-doctor[ansible-core] --user
# .. or as root # .. or as root
$ sudo pip install ansible-doctor $ sudo pip install ansible-doctor[ansible-core]
# From Wheel file # From Wheel file
$ pip install https://github.com/thegeeklab/ansible-doctor/releases/download/v0.1.1/ansible_doctor-0.1.1-py2.py3-none-any.whl # Please check first whether a newer version is available.
$ pip install https://github.com/thegeeklab/ansible-doctor/releases/download/v3.1.4/ansible_doctor-3.1.4-py2.py3-none-any.whl[ansible-core]
``` ```

View File

@ -18,59 +18,104 @@ Configuration options can be set in different places, which are processed in the
```YAML ```YAML
--- ---
# default is the current working directory # Default is the current working directory.
role_dir: base_dir:
# default is the basename of 'role_name'
role_name: role:
# Default is the basename of 'role_name'.
name:
# Auto-detect if the given directory is a role, can be disabled # Auto-detect if the given directory is a role, can be disabled
# to parse loose files instead. # to parse loose files instead.
role_detection: True autodetect: True
# don't write anything to file system
# Don't write anything to file system.
dry_run: False dry_run: False
logging:
# possible options debug | info | warning | error | critical
level: "warning"
# json logging can be enabled if a parsable output is required
json: False
# path to write rendered template file
# default is the current working directory
output_dir:
# default is in-build templates directory
template_dir:
template: readme
# don't ask to overwrite if output file exists
force_overwrite: False
# load custom header from given file and append template output
# to it before write.
custom_header: ""
exclude_files: [] exclude_files: []
# Examples # Examples
# exclude_files: # exclude_files:
# - molecule/ # - molecule/
# - files/**/*.py # - files/**/*.py
# Exclude tags from automatic detection. Configured tags are only skipped
# if the tag is not used in an annotation.
exclude_tags: []
logging:
# Possible options: debug|info|warning| error|critical
level: "warning"
# JSON logging can be enabled if a parsable output is required.
json: False
template:
# Name of the template to be used. In most cases, this is the name of a directory that is attached to the
# the `src` path or Git repo (see example below).
name: readme
# Template provider source. Currently supported providers are `local|git`.
# The `local` provider loads templates from the local file system. This provider
# is used by default and uses the built-in templates.
#
# Examples:
# template:
# name: readme
# src: local>/tmp/custom_templates/
#
# The `git` provider allows templates to be loaded from a git repository. At the moment
# the functions of this provider are limited and only public repositories are supported.
#
# Examples:
# template:
# src: git>https://github.com/thegeeklab/ansible-doctor
# name: ansibledoctor/templates/readme
#
# template:
# src: git>git@github.com:thegeeklab/ansible-doctor.git
# name: ansibledoctor/templates/readme
#
# template:
# src: git>git@github.com:thegeeklab/ansible-doctor.git#branch-or-tag
# name: ansibledoctor/templates/readme
src:
options:
# Configures whether to tabulate variables in the output. When set to `True`,
# variables will be displayed in a tabular format intsead of plain marktdown sections.
# NOTE: This option does not support rendering multiline code blocks.
tabulate_vars: False
renderer:
# By default, double spaces, spaces before and after line breaks or tab characters, etc.
# are automatically removed before the template is rendered. As a result, indenting
# with spaces does not work. If you want to use spaces to indent text, you must disable
# this option.
autotrim: True
# Load custom header from given file and append template output to it before write.
include_header: ""
# Path to write rendered template file. Default is the current working directory.
dest:
# Don't ask to overwrite if output file exists.
force_overwrite: False
``` ```
## CLI ## CLI
```Shell ```Shell
$ ansible-doctor --help $ ansible-doctor --help
usage: ansible-doctor [-h] [-c CONFIG_FILE] [-o OUTPUT_DIR] [-f] [-d] [-n] [-v] [-q] [--version] [role_dir] usage: ansible-doctor [-h] [-c CONFIG_FILE] [-o OUTPUT_DIR] [-r] [-f] [-d] [-n] [-v] [-q] [--version] [base_dir]
Generate documentation from annotated Ansible roles using templates Generate documentation from annotated Ansible roles using templates
positional arguments: positional arguments:
role_dir role directory (default: current working dir) base_dir base directory (default: current working directory)
optional arguments: options:
-h, --help show this help message and exit -h, --help show this help message and exit
-c CONFIG_FILE, --config CONFIG_FILE -c CONFIG_FILE, --config CONFIG_FILE
location of configuration file path to configuration file
-o OUTPUT_DIR, --output OUTPUT_DIR -o OUTPUT_DIR, --output OUTPUT_DIR
output base dir output directory
-r, --recursive run recursively over the base directory subfolders
-f, --force force overwrite output file -f, --force force overwrite output file
-d, --dry-run dry run without writing -d, --dry-run dry run without writing
-n, --no-role-detection -n, --no-role-detection
@ -82,19 +127,48 @@ optional arguments:
## Environment Variables ## Environment Variables
{{< hint type=note >}}
List configuration options need to be passed as JSON strings.
{{< /hint >}}
```Shell ```Shell
ANSIBLE_DOCTOR_CONFIG_FILE= ANSIBLE_DOCTOR_BASE_DIR=
ANSIBLE_DOCTOR_ROLE_DETECTION=true ANSIBLE_DOCTOR_DRY_RUN=False
ANSIBLE_DOCTOR_ROLE_DIR= ANSIBLE_DOCTOR_EXCLUDE_FILES="['molecule/']"
ANSIBLE_DOCTOR_ROLE_NAME= ANSIBLE_DOCTOR_EXCLUDE_TAGS="[]"
ANSIBLE_DOCTOR_DRY_RUN=false
ANSIBLE_DOCTOR_LOG_LEVEL=warning ANSIBLE_DOCTOR_ROLE__NAME=
ANSIBLE_DOCTOR_LOG_JSON=false ANSIBLE_DOCTOR_ROLE__AUTODETECT=True
ANSIBLE_DOCTOR_OUTPUT_DIR=
ANSIBLE_DOCTOR_TEMPLATE_DIR= ANSIBLE_DOCTOR_LOGGING__LEVEL="warning"
ANSIBLE_DOCTOR_TEMPLATE=readme ANSIBLE_DOCTOR_LOGGING__JSON=False
ANSIBLE_DOCTOR_FORCE_OVERWRITE=false
ANSIBLE_DOCTOR_CUSTOM_HEADER= ANSIBLE_DOCTOR_TEMPLATE__NAME=readme
ANSIBLE_DOCTOR_EXCLUDE_FILES= ANSIBLE_DOCTOR_TEMPLATE__SRC=
ANSIBLE_DOCTOR_EXCLUDE_FILES=molecule/,files/**/*.py ANSIBLE_DOCTOR_TEMPLATE__OPTIONS__TABULATE_VARS=False
ANSIBLE_DOCTOR_RENDERER__AUTOTRIM=True
ANSIBLE_DOCTOR_RENDERER__INCLUDE_HEADER=
ANSIBLE_DOCTOR_RENDERER__DEST=
ANSIBLE_DOCTOR_RENDERER__FORCE_OVERWRITE=False
``` ```
## Pre-Commit setup
To use _ansible-doctor_ with the [pre-commit](https://pre-commit.com/) framework, add the following to the `.pre-commit-config.yaml` file in your local repository.
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<!-- spellchecker-disable -->
{{< highlight yaml "linenos=table" >}}
- repo: https://github.com/thegeeklab/ansible-doctor
# update version with `pre-commit autoupdate`
rev: v4.0.4
hooks:
- id: ansible-doctor
{{< /highlight >}}
<!-- spellchecker-enable -->
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->

View File

@ -12,7 +12,7 @@ ansible-doctor FOLDER
If no folder is passed to _ansible-doctor_, the current working directory is used. The first step is to determine if the specified folder is an Ansible role. This check is very simple and only verifies if there is a sub-directory named `tasks` in the specified folder. After a successful check, _ansible-doctor_ registers all files of the role to search them for annotations. If no folder is passed to _ansible-doctor_, the current working directory is used. The first step is to determine if the specified folder is an Ansible role. This check is very simple and only verifies if there is a sub-directory named `tasks` in the specified folder. After a successful check, _ansible-doctor_ registers all files of the role to search them for annotations.
Without any further work _ansible-doctor_ can already create a documentation of the available variables and some meta information if the role contains [meta information](https://galaxy.ansible.com/docs/contributing/creating_role.html#role-metadata). This basic information can be extended with a set of available annotations. Without any further work _ansible-doctor_ can already create a documentation of the available variables and some meta information if the role contains. This basic information can be extended with a set of available annotations. If you want to see it in action you can find a [demo role](https://github.com/thegeeklab/ansible-doctor/tree/main/example) with a lot of examples in the repository.
## Annotations ## Annotations
@ -33,7 +33,7 @@ option1
# the default description with an annotation. # the default description with an annotation.
# @end # @end
# @meta author: [John Doe](https://blog.example.com) # @meta author:value: [John Doe](https://blog.example.com)
``` ```
### `@var` ### `@var`
@ -44,16 +44,28 @@ option1
: the name of the variable to which additional information should be added : the name of the variable to which additional information should be added
option2 option2
: supports `["value", "example", "description"]` as information scopes : supports `["value", "example", "description", "type", "deprecated"]` as information scopes
**Example:** #### `value`
```YAML ```yaml
# @var docker_registry_password:value: "secure_overwrite" # @var docker_registry_password:value: $ "secret"
# @var docker_registry_password: "secure_overwrite" docker_registry_password: "secret"
```
# @var docker_registry_password:example: "%8gv_5GA?" #### `example`
```yaml
# @var docker_registry_password:example: $ "randomPassw0rd"
# @var docker_registry_password:example: >
# docker_registry_password: "randomPassw0rd"
# @end
docker_registry_password: "secret"
```
#### `description`
```yaml
# @var docker_registry_password:description: Very secure password to login to the docker registry. # @var docker_registry_password:description: Very secure password to login to the docker registry.
# @var docker_registry_password:description: > # @var docker_registry_password:description: >
# Multi line description are possible as well. # Multi line description are possible as well.
@ -62,6 +74,21 @@ option2
docker_registry_password: "secret" docker_registry_password: "secret"
``` ```
#### `type`
```yaml
# @var docker_registry_password:type: string
docker_registry_password: "secret"
```
#### `deprecated`
```yaml
# @var docker_registry_password:deprecated: true
# @var docker_registry_password:deprecated: since v1.0.0
docker_registry_password: "secret"
```
### `@tag` ### `@tag`
Used tags within the Ansible task files will be auto-discovered. This identifier can be used to define tags manually or add extended information to discovered tags. Used tags within the Ansible task files will be auto-discovered. This identifier can be used to define tags manually or add extended information to discovered tags.

162
docs/static/socialmedia.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -1,5 +1,10 @@
--- ---
custom_header: HEADER.md
logging: logging:
level: debug level: debug
template: readme
template:
src: git>https://github.com/thegeeklab/ansible-doctor
name: ansibledoctor/templates/readme
renderer:
include_header: HEADER.md

View File

@ -1,4 +1,4 @@
# demo-role-custom-header # demo-role-custom-header
[![Build Status](https://img.shields.io/drone/build/thegeeklab/ansible-doctor?logo=drone&server=https%3A%2F%2Fdrone.thegeeklab.de)](https://drone.thegeeklab.de/thegeeklab/ansible-doctor) [![Build Status](https://ci.thegeeklab.de/api/badges/thegeeklab/ansible-doctor/status.svg)](https://ci.thegeeklab.de/repos/thegeeklab/ansible-doctor)
[![License: GPL-3.0](https://img.shields.io/github/license/thegeeklab/ansible-doctor)](https://github.com/thegeeklab/ansible-doctor/blob/main/LICENSE) [![License: GPL-3.0](https://img.shields.io/github/license/thegeeklab/ansible-doctor)](https://github.com/thegeeklab/ansible-doctor/blob/main/LICENSE)

View File

@ -1,17 +1,24 @@
# demo-role-custom-header # demo-role-custom-header
[![Build Status](https://img.shields.io/drone/build/thegeeklab/ansible-doctor?logo=drone&server=https%3A%2F%2Fdrone.thegeeklab.de)](https://drone.thegeeklab.de/thegeeklab/ansible-doctor) [![Build Status](https://ci.thegeeklab.de/api/badges/thegeeklab/ansible-doctor/status.svg)](https://ci.thegeeklab.de/repos/thegeeklab/ansible-doctor)
[![License: GPL-3.0](https://img.shields.io/github/license/thegeeklab/ansible-doctor)](https://github.com/thegeeklab/ansible-doctor/blob/main/LICENSE) [![License: GPL-3.0](https://img.shields.io/github/license/thegeeklab/ansible-doctor)](https://github.com/thegeeklab/ansible-doctor/blob/main/LICENSE)
Role to demonstrate ansible-doctor. It is also possible to overwrite the default description with an annotation. Role to demonstrate ansible-doctor. It is also possible to overwrite
the default description with an annotation.
## Table of content ## Table of content
- [Requirements](#requirements)
- [Default Variables](#default-variables) - [Default Variables](#default-variables)
- [demo_bool](#demo_bool)
- [demo_role_deprecated](#demo_role_deprecated)
- [demo_role_deprecated_info](#demo_role_deprecated_info)
- [demo_role_dict](#demo_role_dict) - [demo_role_dict](#demo_role_dict)
- [demo_role_empty](#demo_role_empty) - [demo_role_empty](#demo_role_empty)
- [demo_role_empty_dict](#demo_role_empty_dict) - [demo_role_empty_dict](#demo_role_empty_dict)
- [demo_role_other_tags](#demo_role_other_tags) - [demo_role_other_tags](#demo_role_other_tags)
- [demo_role_override](#demo_role_override)
- [demo_role_override_complex](#demo_role_override_complex)
- [demo_role_single](#demo_role_single) - [demo_role_single](#demo_role_single)
- [demo_role_undefined_var](#demo_role_undefined_var) - [demo_role_undefined_var](#demo_role_undefined_var)
- [demo_role_unset](#demo_role_unset) - [demo_role_unset](#demo_role_unset)
@ -23,8 +30,47 @@ Role to demonstrate ansible-doctor. It is also possible to overwrite the default
--- ---
## Requirements
- Minimum Ansible version: `2.10`
## Default Variables ## Default Variables
### demo_bool
#### Default value
```YAML
demo_bool: true
```
#### Example usage
```YAML
demo_bool: false
```
### demo_role_deprecated
**_Deprecated_**<br />
#### Default value
```YAML
demo_role_deprecated: b
```
### demo_role_deprecated_info
**_Deprecated:_** This variable is deprected since `v2.0.0` and will be removed in a future release.<br />
**_Type:_** string<br />
#### Default value
```YAML
demo_role_deprecated_info: a
```
### demo_role_dict ### demo_role_dict
#### Default value #### Default value
@ -59,7 +105,8 @@ demo_role_empty: ''
### demo_role_empty_dict ### demo_role_empty_dict
... or valid json can be used. In this case, the json will be automatically prefixed with the annotation key and filters like `to_nice_yaml` can be used in templates. To get it working, the json need to be prefixed with a `$`. ... or valid json can be used. In this case, the json will be automatically prefixed with the annotation key
and filters like `to_nice_yaml` can be used in templates. To get it working, the json need to be prefixed with a `$`.
#### Default value #### Default value
@ -97,6 +144,24 @@ demo_role_other_tags:
- package2 - package2
``` ```
### demo_role_override
#### Default value
```YAML
demo_role_override: test
```
### demo_role_override_complex
#### Default value
```YAML
demo_role_override_complex:
foo: bar
second: value
```
### demo_role_single ### demo_role_single
#### Default value #### Default value
@ -107,7 +172,12 @@ demo_role_single: b
### demo_role_undefined_var ### demo_role_undefined_var
To highlight a variable that has not set a value by default, this is one way to achieve it. Make sure to flag it as json value: `@var demo_role_undefined_var: $ "_unset_"` To highlight a variable that has not set a value by default, this is one way to achieve it.
Make sure to flag it as json value: `@var demo_role_undefined_var: $ "_unset_"`
| Attribute | Description |
| --- | --- |
| value1 | desc1 |
#### Default value #### Default value
@ -149,7 +219,7 @@ demo_role_unset: some_value
## Dependencies ## Dependencies
None. - role2
## License ## License
@ -157,4 +227,4 @@ MIT
## Author ## Author
John Doe [John Doe](https://blog.example.com)

View File

@ -6,6 +6,9 @@ demo_role_unset:
demo_role_empty: "" demo_role_empty: ""
demo_role_single: "b" demo_role_single: "b"
# @var demo_bool:example: $ false
demo_bool: true
# @var demo_role_empty_dict:description: > # @var demo_role_empty_dict:description: >
# ... or valid json can be used. In this case, the json will be automatically prefixed with the annotation key # ... or valid json can be used. In this case, the json will be automatically prefixed with the annotation key
# and filters like `to_nice_yaml` can be used in templates. To get it working, the json need to be prefixed with a `$`. # and filters like `to_nice_yaml` can be used in templates. To get it working, the json need to be prefixed with a `$`.
@ -31,6 +34,11 @@ demo_role_dict:
# @var demo_role_undefined_var:description: > # @var demo_role_undefined_var:description: >
# To highlight a variable that has not set a value by default, this is one way to achieve it. # To highlight a variable that has not set a value by default, this is one way to achieve it.
# Make sure to flag it as json value: `@var demo_role_undefined_var: $ "_unset_"` # Make sure to flag it as json value: `@var demo_role_undefined_var: $ "_unset_"`
#
# | Attribute | Description |
# | --- | --- |
# | value1 | desc1 |
#
# @end # @end
# @var demo_role_undefined_var: $ "_unset_" # @var demo_role_undefined_var: $ "_unset_"
@ -44,3 +52,19 @@ demo_role_dict:
# ] # ]
# @end # @end
demo_role_other_tags: [] demo_role_other_tags: []
## Simple value
# @var demo_role_override: $ "test"
demo_role_override: original
## Complex value
# @var demo_role_override_complex:value: $ {"foo":"bar", "second":"value"}
demo_role_override_complex: {}
# @var demo_role_deprecated:deprecated:
demo_role_deprecated: "b"
# @var demo_role_deprecated_info:deprecated: >
# This variable is deprected since `v2.0.0` and will be removed in a future release.
# @var demo_role_deprecated_info:type: string
demo_role_deprecated_info: "a"

View File

@ -3,17 +3,20 @@
# Role to demonstrate ansible-doctor. It is also possible to overwrite # Role to demonstrate ansible-doctor. It is also possible to overwrite
# the default description with an annotation. # the default description with an annotation.
# @end # @end
# @meta author: [John Doe](https://blog.example.com) # @meta author: [John Doe](https\://blog.example.com)
galaxy_info: galaxy_info:
description: Role to demonstrate ansible-doctor. description: Role to demonstrate ansible-doctor.
author: John Doe author: John Doe
license: MIT license: MIT
min_ansible_version: 2.4 min_ansible_version: "2.10"
platforms: platforms:
- name: EL - name: EL
versions: versions:
- 7 - "9"
galaxy_tags: galaxy_tags:
- demo - demo
- documentation - documentation
dependencies: []
dependencies:
- role: role2
- name: namespace.role3

View File

@ -11,6 +11,8 @@
- name: Demo task with a tag list - name: Demo task with a tag list
debug: debug:
msg: "Demo message" msg: "Demo message"
tags:
- module-tag
tags: tags:
- role-tag1 - role-tag1
- role-tag2 - role-tag2

View File

@ -0,0 +1,9 @@
---
logging:
level: debug
template:
name: readme
renderer:
include_header: HEADER.md

View File

@ -0,0 +1,4 @@
# other-role-custom-header
[![Build Status](https://ci.thegeeklab.de/api/badges/thegeeklab/ansible-doctor/status.svg)](https://ci.thegeeklab.de/repos/thegeeklab/ansible-doctor)
[![License: GPL-3.0](https://img.shields.io/github/license/thegeeklab/ansible-doctor)](https://github.com/thegeeklab/ansible-doctor/blob/main/LICENSE)

View File

@ -0,0 +1,242 @@
# other-role-custom-header
[![Build Status](https://ci.thegeeklab.de/api/badges/thegeeklab/ansible-doctor/status.svg)](https://ci.thegeeklab.de/repos/thegeeklab/ansible-doctor)
[![License: GPL-3.0](https://img.shields.io/github/license/thegeeklab/ansible-doctor)](https://github.com/thegeeklab/ansible-doctor/blob/main/LICENSE)
Role to demonstrate ansible-doctor.
## Table of content
- [Requirements](#requirements)
- [Default Variables](#default-variables)
- [other_role_bool](#other_role_bool)
- [other_role_deprecated](#other_role_deprecated)
- [other_role_deprecated_info](#other_role_deprecated_info)
- [other_role_dict](#other_role_dict)
- [other_role_empty](#other_role_empty)
- [other_role_empty_dict](#other_role_empty_dict)
- [other_role_multiline_type](#other_role_multiline_type)
- [other_role_other_tags](#other_role_other_tags)
- [other_role_override](#other_role_override)
- [other_role_override_complex](#other_role_override_complex)
- [other_role_single](#other_role_single)
- [other_role_undefined_var](#other_role_undefined_var)
- [other_role_unset](#other_role_unset)
- [Discovered Tags](#discovered-tags)
- [Open Tasks](#open-tasks)
- [Dependencies](#dependencies)
- [License](#license)
- [Author](#author)
---
## Requirements
- Minimum Ansible version: `2.10`
## Default Variables
### other_role_bool
#### Default value
```YAML
other_role_bool: true
```
#### Example usage
```YAML
other_role_bool: false
```
### other_role_deprecated
**_Deprecated_**<br />
#### Default value
```YAML
other_role_deprecated: b
```
### other_role_deprecated_info
**_Deprecated:_** This variable is deprected since `v2.0.0` and will be removed in a future release.<br />
**_Type:_** string<br />
#### Default value
```YAML
other_role_deprecated_info: a
```
### other_role_dict
#### Default value
```YAML
other_role_dict:
key1:
sub: some value
```
#### Example usage
```YAML
other_role_dict:
key1:
sub: some value
# Inline description
key2:
sublist:
- subval1
- subval2
```
### other_role_empty
#### Default value
```YAML
other_role_empty: ''
```
### other_role_empty_dict
... or valid json can be used. In this case, the json will be automatically prefixed with the annotation key
and filters like `to_nice_yaml` can be used in templates. To get it working, the json need to be prefixed with a `$`.
#### Default value
```YAML
other_role_empty_dict: {}
```
#### Example usage
```YAML
other_role_empty_dict:
key1:
sub: some value
key2:
sublist:
- subval1
- subval2
```
### other_role_multiline_type
**_Type:_** string
list
dict<br />
#### Default value
```YAML
other_role_multiline_type: a
```
### other_role_other_tags
If a variable need some more explanation, this is a good place to do so.
#### Default value
```YAML
other_role_other_tags:
- package1
- package2
```
#### Example usage
```YAML
other_role_other_tags:
- package1
- package2
```
### other_role_override
#### Default value
```YAML
other_role_override: test
```
### other_role_override_complex
#### Default value
```YAML
other_role_override_complex:
foo: bar
second: value
```
### other_role_single
#### Default value
```YAML
other_role_single: b
```
### other_role_undefined_var
To highlight a variable that has not set a value by default, this is one way to achieve it.
Make sure to flag it as json value: `@var other_role_undefined_var: $ "_unset_"`
| Attribute | Description |
| --- | --- |
| value1 | desc1 |
#### Default value
```YAML
other_role_undefined_var: _unset_
```
### other_role_unset
Values can be plain strings, but there is no magic or autoformatting...
#### Default value
```YAML
other_role_unset:
```
#### Example usage
```YAML
other_role_unset: some_value
```
## Discovered Tags
**_role-tag1_**
**_role-tag2_**
## Open Tasks
- Unscoped general todo.
- (bug): Some bug that is known and need to be fixed.
- (bug): Multi line description are possible as well. Some bug that is known and need to be fixed.
- (improvement): Some things that need to be improved.
## Dependencies
- role1
- role2
## License
MIT
## Author
[John Doe](https://blog.example.com)

View File

@ -0,0 +1,78 @@
---
# @var other_role_unset:description: Values can be plain strings, but there is no magic or autoformatting...
# @var other_role_unset:example: other_role_unset: some_value
other_role_unset:
other_role_empty: ""
other_role_single: "b"
# @var other_role_bool:example: $ false
other_role_bool: True
# @var other_role_empty_dict:description: >
# ... or valid json can be used. In this case, the json will be automatically prefixed with the annotation key
# and filters like `to_nice_yaml` can be used in templates. To get it working, the json need to be prefixed with a `$`.
# @end
# @var other_role_empty_dict:example: $ {"key1": {"sub": "some value"}, "key2": {"sublist": ["subval1", "subval2"]}}
other_role_empty_dict: {}
# @var other_role_dict:example: >
# other_role_dict:
# key1:
# sub: some value
#
# # Inline description
# key2:
# sublist:
# - subval1
# - subval2
# @end
other_role_dict:
key1:
sub: some value
# @var other_role_undefined_var:description: >
# To highlight a variable that has not set a value by default, this is one way to achieve it.
# Make sure to flag it as json value: `@var other_role_undefined_var: $ "_unset_"`
#
# | Attribute | Description |
# | --- | --- |
# | value1 | desc1 |
#
# @end
# @var other_role_undefined_var: $ "_unset_"
# @var other_role_other_tags:description: >
# If a variable need some more explanation, this is a good place to do so.
# @end
# @var other_role_other_tags:example: $>
# [
# "package1",
# "package2"
# ]
# @end
# @var other_role_other_tags:value: $ ["package1", "package2"]
other_role_other_tags: []
## Simple value
# @var other_role_override: $ "test"
other_role_override: original
## Complex value
# @var other_role_override_complex:value: $ {"foo":"bar", "second":"value"}
other_role_override_complex: {}
# @var other_role_deprecated:deprecated:
other_role_deprecated: "b"
# @var other_role_deprecated_info:deprecated: >
# This variable is deprected since `v2.0.0` and will be removed in a future release.
# @var other_role_deprecated_info:type: string
other_role_deprecated_info: "a"
# @var other_role_multiline_type:type: >
# string
# list
# dict
# @end
other_role_multiline_type: "a"

View File

@ -0,0 +1,19 @@
---
# @meta author: [John Doe](https\://blog.example.com)
galaxy_info:
description: Role to demonstrate ansible-doctor.
author: John Doe
license: MIT
min_ansible_version: "2.10"
platforms:
- name: EL
versions:
- "9"
galaxy_tags:
- demo
- documentation
dependencies:
- role1
- role: role2
- name: namespace.role3

View File

@ -0,0 +1,16 @@
---
# @todo bug: Some bug that is known and need to be fixed.
# @todo bug: >
# Multi line description are possible as well.
# Some bug that is known and need to be fixed.
# @end
# @todo improvement: Some things that need to be improved.
# @todo default: Unscoped general todo.
- name: Demo task with a tag list
debug:
msg: "Demo message"
tags:
- role-tag1
- role-tag2

1549
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -10,10 +10,10 @@ classifiers = [
"Natural Language :: English", "Natural Language :: English",
"Operating System :: POSIX", "Operating System :: POSIX",
"Programming Language :: Python :: 3", "Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Utilities", "Topic :: Utilities",
"Topic :: Software Development", "Topic :: Software Development",
"Topic :: Software Development :: Documentation", "Topic :: Software Development :: Documentation",
@ -21,72 +21,53 @@ classifiers = [
description = "Generate documentation from annotated Ansible roles using templates." description = "Generate documentation from annotated Ansible roles using templates."
documentation = "https://ansible-doctor.geekdocs.de/" documentation = "https://ansible-doctor.geekdocs.de/"
homepage = "https://ansible-doctor.geekdocs.de/" homepage = "https://ansible-doctor.geekdocs.de/"
include = [ include = ["LICENSE"]
"LICENSE",
]
keywords = ["ansible", "role", "documentation"] keywords = ["ansible", "role", "documentation"]
license = "GPL-3.0-only" license = "GPL-3.0-only"
name = "ansible-doctor" name = "ansible-doctor"
packages = [ packages = [{ include = "ansibledoctor" }]
{include = "ansibledoctor"},
]
readme = "README.md" readme = "README.md"
repository = "https://github.com/thegeeklab/ansible-doctor/" repository = "https://github.com/thegeeklab/ansible-doctor/"
version = "0.0.0" version = "0.0.0"
[tool.poetry.dependencies] [tool.poetry.dependencies]
Jinja2 = "3.0.3" Jinja2 = "3.1.4"
anyconfig = "0.12.0" anyconfig = "0.14.0"
appdirs = "1.4.4" appdirs = "1.4.4"
colorama = "0.4.4" colorama = "0.4.6"
environs = "9.5.0" pathspec = "0.12.1"
jsonschema = "4.4.0" python = "^3.10.0"
nested-lookup = "0.2.23" "ruamel.yaml" = "0.18.6"
pathspec = "0.9.0" dynaconf = "3.2.6"
python = "^3.7.0" gitpython = "3.1.43"
python-json-logger = "2.0.2" ansible-core = { version = "2.14.18", optional = true }
"ruamel.yaml" = "0.17.21" structlog = "24.4.0"
[tool.poetry.dev-dependencies] [tool.poetry.extras]
bandit = "1.7.2" ansible-core = ["ansible-core"]
flake8 = "4.0.1"
flake8-blind-except = "0.2.0"
flake8-builtins = "1.5.3"
flake8-docstrings = "1.6.0"
flake8-eradicate = "1.2.0"
flake8-isort = "4.1.1"
flake8-logging-format = "0.6.0"
flake8-pep3101 = "1.3.0"
flake8-polyfill = "1.0.2"
flake8-quotes = "3.3.1"
pep8-naming = "0.12.1"
pydocstyle = "6.1.1"
pytest = "7.0.1"
pytest-cov = "3.0.0"
pytest-mock = "3.7.0"
yapf = "0.32.0"
toml = "0.10.2"
[tool.poetry.scripts] [tool.poetry.scripts]
ansible-doctor = "ansibledoctor.cli:main" ansible-doctor = "ansibledoctor.cli:main"
[tool.poetry.group.dev.dependencies]
ruff = "0.7.3"
pytest = "8.3.3"
pytest-mock = "3.14.0"
pytest-cov = "6.0.0"
toml = "0.10.2"
j2lint = "1.1.0"
[tool.poetry-dynamic-versioning] [tool.poetry-dynamic-versioning]
enable = true enable = true
style = "semver" style = "semver"
vcs = "git" vcs = "git"
[tool.isort]
default_section = "THIRDPARTY"
force_single_line = true
line_length = 99
sections = ["FUTURE", "STDLIB", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"]
skip_glob = ["**/.env*", "**/env/*", "**/.venv/*", "**/docs/*"]
[tool.pytest.ini_options] [tool.pytest.ini_options]
addopts = "ansibledoctor --cov=ansibledoctor --cov-report=xml:coverage.xml --cov-report=term --cov-append --no-cov-on-fail" addopts = "ansibledoctor --cov=ansibledoctor --cov-report=xml:coverage.xml --cov-report=term --no-cov-on-fail"
filterwarnings = [ filterwarnings = [
"ignore::FutureWarning", "ignore::FutureWarning",
"ignore:.*collections.*:DeprecationWarning", "ignore::DeprecationWarning",
"ignore:.*pep8.*:FutureWarning", "ignore:.*pep8.*:FutureWarning",
] ]
@ -94,5 +75,70 @@ filterwarnings = [
omit = ["**/test/*"] omit = ["**/test/*"]
[build-system] [build-system]
build-backend = "poetry.core.masonry.api" build-backend = "poetry_dynamic_versioning.backend"
requires = ["poetry-core>=1.0.0", "poetry-dynamic-versioning"] requires = ["poetry-core>=1.0.0", "poetry-dynamic-versioning"]
[tool.ruff]
exclude = [
".git",
"__pycache__",
"build",
"dist",
"test",
"*.pyc",
"*.egg-info",
".cache",
".eggs",
"env*",
]
line-length = 99
indent-width = 4
[tool.ruff.lint]
# Explanation of errors
#
# D102: Missing docstring in public method
# D103: Missing docstring in public function
# D105: Missing docstring in magic method
# D107: Missing docstring in __init__
# D202: No blank lines allowed after function docstring
# D203: One blank line required before class docstring
# D212: Multi-line docstring summary should start at the first line
ignore = [
"D102",
"D103",
"D105",
"D107",
"D202",
"D203",
"D212",
"UP038",
"RUF012",
]
select = [
"D",
"E",
"F",
"Q",
"W",
"I",
"S",
"BLE",
"N",
"UP",
"B",
"A",
"C4",
"T20",
"SIM",
"RET",
"ARG",
"ERA",
"RUF",
]
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
line-ending = "lf"

View File

@ -1,4 +1,17 @@
{ {
"$schema": "https://docs.renovatebot.com/renovate-schema.json", "$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["github>thegeeklab/renovate-presets"] "extends": ["github>thegeeklab/renovate-presets"],
"packageRules": [
{
"description": "Ansible base dependencies",
"matchPackageNames": ["ansible-core"],
"separateMinorPatch": true
},
{
"matchManagers": ["woodpecker"],
"matchFileNames": [".woodpecker/test.yml"],
"matchPackageNames": ["docker.io/library/python"],
"enabled": false
}
]
} }

View File

@ -1,20 +0,0 @@
[flake8]
# Explanation of errors
#
# D102: Missing docstring in public method
# D103: Missing docstring in public function
# D105: Missing docstring in magic method
# D107: Missing docstring in __init__
# D202: No blank lines allowed after function docstring
# W503:Line break occurred before a binary operator
ignore = D102, D103, D105, D107, D202, W503
max-line-length = 99
inline-quotes = double
exclude = .git, __pycache__, build, dist, test, *.pyc, *.egg-info, .cache, .eggs, env*
[yapf]
based_on_style = google
column_limit = 99
dedent_closing_brackets = true
coalesce_brackets = true
split_before_logical_operator = true