task2md 1.1.2__tar.gz → 1.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. {task2md-1.1.2 → task2md-1.2.0}/.gitignore +4 -1
  2. task2md-1.2.0/.gitlab-ci.yml +105 -0
  3. task2md-1.2.0/.gitleaks.toml +4 -0
  4. {task2md-1.1.2 → task2md-1.2.0}/.pre-commit-config.yaml +5 -4
  5. task2md-1.2.0/.python-version +1 -0
  6. {task2md-1.1.2 → task2md-1.2.0}/PKG-INFO +9 -9
  7. {task2md-1.1.2 → task2md-1.2.0}/README.md +2 -2
  8. task2md-1.2.0/Taskfile.project.yml +108 -0
  9. {task2md-1.1.2 → task2md-1.2.0}/Taskfile.yml +14 -12
  10. {task2md-1.1.2 → task2md-1.2.0}/docs/cli.md +1 -1
  11. {task2md-1.1.2 → task2md-1.2.0}/docs/index.md +1 -1
  12. {task2md-1.1.2 → task2md-1.2.0}/mkdocs.yml +4 -0
  13. task2md-1.2.0/pyproject.toml +97 -0
  14. task2md-1.2.0/renovate.json +43 -0
  15. task2md-1.2.0/src/task2md/task2md.py +148 -0
  16. {task2md-1.1.2 → task2md-1.2.0}/src/task2md/template/file.py +81 -64
  17. {task2md-1.1.2 → task2md-1.2.0}/src/task2md/template/header.py +10 -16
  18. {task2md-1.1.2 → task2md-1.2.0}/src/task2md/template/index.py +5 -12
  19. {task2md-1.1.2 → task2md-1.2.0}/src/task2md/template/task.py +56 -46
  20. {task2md-1.1.2 → task2md-1.2.0}/src/task2md/template/variable.py +3 -14
  21. task2md-1.2.0/src/task2md/util/dir.py +30 -0
  22. {task2md-1.1.2/tests/task → task2md-1.2.0/tests/template}/test_file.py +62 -2
  23. {task2md-1.1.2/tests/task → task2md-1.2.0/tests/template}/test_header.py +3 -6
  24. {task2md-1.1.2/tests/task → task2md-1.2.0/tests/template}/test_index.py +0 -2
  25. {task2md-1.1.2/tests/task → task2md-1.2.0/tests/template}/test_task.py +18 -3
  26. {task2md-1.1.2/tests/task → task2md-1.2.0/tests/template}/test_variable.py +0 -2
  27. {task2md-1.1.2 → task2md-1.2.0}/tests/test_dir.py +71 -15
  28. {task2md-1.1.2 → task2md-1.2.0}/tests/test_file.py +19 -13
  29. {task2md-1.1.2 → task2md-1.2.0}/tests/test_task2md.py +0 -2
  30. task2md-1.2.0/tests/util/__init__.py +0 -0
  31. {task2md-1.1.2 → task2md-1.2.0}/tests/util/test_dir.py +5 -8
  32. task2md-1.2.0/uv.lock +871 -0
  33. task2md-1.1.2/.gitlab-ci.yml +0 -35
  34. task2md-1.1.2/.python-version +0 -1
  35. task2md-1.1.2/.vale.ini +0 -8
  36. task2md-1.1.2/Taskfile.project.yml +0 -52
  37. task2md-1.1.2/pyproject.toml +0 -76
  38. task2md-1.1.2/requirements-dev.lock +0 -138
  39. task2md-1.1.2/requirements.lock +0 -25
  40. task2md-1.1.2/src/task2md/task2md.py +0 -134
  41. task2md-1.1.2/src/task2md/util/dir.py +0 -37
  42. {task2md-1.1.2 → task2md-1.2.0}/.markdownlint.yaml +0 -0
  43. {task2md-1.1.2 → task2md-1.2.0}/.releaserc +0 -0
  44. {task2md-1.1.2 → task2md-1.2.0}/.yamllint +0 -0
  45. {task2md-1.1.2 → task2md-1.2.0}/LICENSE +0 -0
  46. {task2md-1.1.2 → task2md-1.2.0}/docs/task2md.md +0 -0
  47. {task2md-1.1.2/docs/task → task2md-1.2.0/docs/template}/file.md +0 -0
  48. {task2md-1.1.2/docs/task → task2md-1.2.0/docs/template}/header.md +0 -0
  49. {task2md-1.1.2/docs/task → task2md-1.2.0/docs/template}/index.md +0 -0
  50. {task2md-1.1.2/docs/task → task2md-1.2.0/docs/template}/task.md +0 -0
  51. {task2md-1.1.2/docs/task → task2md-1.2.0/docs/template}/variable.md +0 -0
  52. {task2md-1.1.2 → task2md-1.2.0}/docs/util/dir.md +0 -0
  53. {task2md-1.1.2 → task2md-1.2.0}/lychee.toml +0 -0
  54. {task2md-1.1.2 → task2md-1.2.0}/src/task2md/__init__.py +0 -0
  55. {task2md-1.1.2 → task2md-1.2.0}/src/task2md/template/__init__.py +0 -0
  56. {task2md-1.1.2 → task2md-1.2.0}/src/task2md/util/__init__.py +0 -0
  57. {task2md-1.1.2 → task2md-1.2.0}/tests/__init__.py +0 -0
  58. {task2md-1.1.2 → task2md-1.2.0}/tests/files/empty.yml +0 -0
  59. {task2md-1.1.2 → task2md-1.2.0}/tests/files/lint.yml +0 -0
  60. {task2md-1.1.2/tests/task → task2md-1.2.0/tests/template}/__init__.py +0 -0
@@ -4,6 +4,7 @@ __pycache__/
4
4
  .coverage
5
5
  build/
6
6
  dist/
7
+ public/
7
8
  reports/
8
9
  wheels/
9
10
  *.egg-info
@@ -13,6 +14,8 @@ wheels/
13
14
 
14
15
  .DS_Store
15
16
  /.*cache/
16
- /.devcontainer/
17
+ /.claude/
18
+ /docs/superpowers/
17
19
  /styles/
18
20
  /Taskfile.d/
21
+ CLAUDE.md
@@ -0,0 +1,105 @@
1
+ ---
2
+ workflow:
3
+ rules:
4
+ - if: $CI_PIPELINE_SOURCE == "schedule"
5
+ - if: $CI_PIPELINE_SOURCE == "web"
6
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
7
+ - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
8
+ when: never
9
+ - if: $CI_COMMIT_TAG
10
+ - if: $CI_COMMIT_BRANCH
11
+
12
+ variables:
13
+ IMAGE_UV: ghcr.io/astral-sh/uv:python${PYTHON_VERSION}-trixie-slim
14
+ PYTHON_VERSION: "3.14"
15
+
16
+ include:
17
+ - component: gitlab.com/op_so/components/core/lint@v2.0.1
18
+ inputs:
19
+ lint_vale: true
20
+ lint_markdown_glob: '"**/*.md" "#docs"'
21
+ - component: gitlab.com/op_so/components/python-uv/prepare-uv@v1.3.0
22
+ inputs:
23
+ prepare_uv_python_version: "3.14"
24
+ - component: gitlab.com/op_so/components/python-uv/lint-uv@v1.3.0
25
+ inputs:
26
+ lint_uv_python_version: "3.14"
27
+ lint_uv_isort: true
28
+ lint_uv_mypy: true
29
+ lint_uv_mypy_args: "--strict src/ tests/"
30
+ lint_uv_pyrefly: true
31
+ # Coverage is on by default and reads `[tool.coverage.run] source` from
32
+ # pyproject.toml, since the component passes `--cov` without an argument.
33
+ - component: gitlab.com/op_so/components/python-uv/test-uv@v1.3.0
34
+ inputs:
35
+ test_uv_python_version: "3.14"
36
+ - component: gitlab.com/op_so/components/core/semantic-release@v2.0.1
37
+ # Only runs on a scheduled pipeline setting RENOVATE=true, and needs a
38
+ # RENOVATE_TOKEN CI/CD variable.
39
+ - component: gitlab.com/op_so/components/core/renovate@v2.0.1
40
+ - component: gitlab.com/op_so/components/python-uv/publish-pypi-uv@v1.3.0
41
+ inputs:
42
+ publish_pypi_uv_python_version: "3.14"
43
+ publish_pypi_uv_stage: pypi-release
44
+
45
+ stages:
46
+ - prepare-uv
47
+ - lint
48
+ - tests
49
+ - release
50
+ - pypi-release
51
+ - pages-release
52
+ - renovate
53
+
54
+ .install-task: &install-task
55
+ - apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends curl ca-certificates
56
+ - sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b /usr/local/bin
57
+
58
+ # The cache block must stay identical to the one used by the python-uv
59
+ # components: they share a single key and any divergence silently splits it.
60
+ .abstract-uv:
61
+ image: $IMAGE_UV
62
+ needs: ["prepare-uv:sync"]
63
+ variables:
64
+ UV_CACHE_DIR: .uv-cache
65
+ cache:
66
+ key:
67
+ files:
68
+ - uv.lock
69
+ prefix: prepare-uv-${CI_DEFAULT_BRANCH}
70
+ paths:
71
+ - .uv-cache
72
+ - .venv
73
+ policy: pull
74
+ interruptible: true
75
+
76
+ semantic-release:
77
+ before_script:
78
+ - npx semantic-release --dry-run --no-ci
79
+ - if [ -s .VERSION ]; then task 00:800-project-set-version VERSION=$(cat .VERSION); fi
80
+
81
+ # The component runs `uv sync --frozen && uv build && uv publish` without
82
+ # substituting the version: without this before_script it would publish 0.0.0.
83
+ publish-pypi-uv:
84
+ before_script:
85
+ - *install-task
86
+ - task 00:800-project-set-version VERSION="${CI_COMMIT_TAG#v}"
87
+
88
+ # Replaces the `pages` job formerly provided by the python.rye-publish template;
89
+ # no python-uv component covers it.
90
+ pages:
91
+ extends: .abstract-uv
92
+ stage: pages-release
93
+ before_script:
94
+ - *install-task
95
+ - uv sync --frozen
96
+ - task 00:800-project-set-version VERSION="${CI_COMMIT_TAG#v}"
97
+ script:
98
+ - uv run mkdocs build --site-dir public
99
+ artifacts:
100
+ paths:
101
+ - public
102
+ rules:
103
+ - if: $DISABLE_JOBS == "true"
104
+ when: never
105
+ - if: $CI_COMMIT_TAG
@@ -0,0 +1,4 @@
1
+ title = "gitleaks config"
2
+
3
+ [extend]
4
+ useDefault = true
@@ -3,11 +3,7 @@ repos:
3
3
  - repo: https://github.com/pre-commit/pre-commit-hooks
4
4
  rev: v4.5.0
5
5
  hooks:
6
- - id: trailing-whitespace
7
- - id: end-of-file-fixer
8
- - id: check-yaml
9
6
  - id: check-added-large-files
10
- # Hooks added from sample-config
11
7
  - id: check-executables-have-shebangs
12
8
  - id: check-json
13
9
  - id: check-merge-conflict
@@ -15,9 +11,14 @@ repos:
15
11
  - id: check-symlinks
16
12
  - id: check-toml
17
13
  - id: check-xml
14
+ - id: check-yaml
18
15
  - id: detect-private-key
19
16
  - id: end-of-file-fixer
20
17
  - id: fix-byte-order-marker
21
18
  - id: mixed-line-ending
22
19
  - id: trailing-whitespace
23
20
  args: [--markdown-linebreak-ext=md]
21
+ - repo: https://github.com/gitleaks/gitleaks
22
+ rev: v8.30.1
23
+ hooks:
24
+ - id: gitleaks
@@ -0,0 +1 @@
1
+ 3.14
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: task2md
3
- Version: 1.1.2
3
+ Version: 1.2.0
4
4
  Summary: A program to generate markdown documentation files from Task files
5
5
  Project-URL: Homepage, https://gitlab.com/op_so/task/task2md
6
6
  Project-URL: Documentation, https://op_so.gitlab.io/task/task2md/
@@ -10,18 +10,18 @@ License-File: LICENSE
10
10
  Classifier: License :: OSI Approved :: MIT License
11
11
  Classifier: Operating System :: OS Independent
12
12
  Classifier: Programming Language :: Python :: 3
13
- Requires-Python: >=3.10
14
- Requires-Dist: click>=8.1.7
15
- Requires-Dist: pydantic>=2.6.3
16
- Requires-Dist: pyyaml>=6.0.1
17
- Requires-Dist: types-pyyaml>=6.0.12.12
13
+ Classifier: Programming Language :: Python :: 3.14
14
+ Requires-Python: >=3.14
15
+ Requires-Dist: click>=8.4.2
16
+ Requires-Dist: pydantic>=2.13.4
17
+ Requires-Dist: pyyaml>=6.0.3
18
18
  Description-Content-Type: text/markdown
19
19
 
20
20
  # `task2md`
21
21
 
22
22
  [![Software License](https://img.shields.io/badge/license-MIT-informational.svg?style=for-the-badge)](LICENSE)
23
23
  [![semantic-release: angular](https://img.shields.io/badge/semantic--release-angular-e10079?logo=semantic-release&style=for-the-badge)](https://github.com/semantic-release/semantic-release)
24
- [![Pipeline Status](https://gitlab.com/op_so/task/task2md/badges/main/pipeline.svg)](https://gitlab.com/op_so/task/task2md/pipelines)
24
+ [![Pipeline Status](https://img.shields.io/gitlab/pipeline-status/op_so/task/task2md?style=for-the-badge)](https://gitlab.com/op_so/task/task2md/pipelines)
25
25
 
26
26
  [![Built with Material for MkDocs](https://img.shields.io/badge/Material_for_MkDocs-526CFE?style=for-the-badge&logo=MaterialForMkDocs&logoColor=white)](https://op_so.gitlab.io/task/task2md/) Source code documentation
27
27
 
@@ -99,7 +99,7 @@ task2md file --input Taskfile.d/lint.yml -d doc_dir/
99
99
 
100
100
  To use:
101
101
 
102
- - Minimal Python version: 3.10
102
+ - Minimal Python version: 3.14
103
103
 
104
104
  Installation with Python `pip`:
105
105
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Software License](https://img.shields.io/badge/license-MIT-informational.svg?style=for-the-badge)](LICENSE)
4
4
  [![semantic-release: angular](https://img.shields.io/badge/semantic--release-angular-e10079?logo=semantic-release&style=for-the-badge)](https://github.com/semantic-release/semantic-release)
5
- [![Pipeline Status](https://gitlab.com/op_so/task/task2md/badges/main/pipeline.svg)](https://gitlab.com/op_so/task/task2md/pipelines)
5
+ [![Pipeline Status](https://img.shields.io/gitlab/pipeline-status/op_so/task/task2md?style=for-the-badge)](https://gitlab.com/op_so/task/task2md/pipelines)
6
6
 
7
7
  [![Built with Material for MkDocs](https://img.shields.io/badge/Material_for_MkDocs-526CFE?style=for-the-badge&logo=MaterialForMkDocs&logoColor=white)](https://op_so.gitlab.io/task/task2md/) Source code documentation
8
8
 
@@ -80,7 +80,7 @@ task2md file --input Taskfile.d/lint.yml -d doc_dir/
80
80
 
81
81
  To use:
82
82
 
83
- - Minimal Python version: 3.10
83
+ - Minimal Python version: 3.14
84
84
 
85
85
  Installation with Python `pip`:
86
86
 
@@ -0,0 +1,108 @@
1
+ ---
2
+ # https://taskfile.dev
3
+ #
4
+ # Taskfile.project.yml for your main project tasks. Must be commited.
5
+ # If you always want the last version of the task templates, add the following line in your .gitignore file
6
+ # /Taskfile.d/
7
+ #
8
+ version: '3'
9
+
10
+ vars:
11
+ # TO MODIFY: Task templates to download separated by comma
12
+ # Example: TASK_TEMPLATES: go,lint,yarn
13
+ TASK_TEMPLATES: git,lint
14
+
15
+ tasks:
16
+
17
+ 00-get-list-templates:
18
+ # Get the list of templates to download
19
+ # Do not remove
20
+ cmds:
21
+ - echo "{{.TASK_TEMPLATES}}"
22
+ silent: true
23
+
24
+ 050-upgrade-dependencies:
25
+ desc: "[PROJECT] Upgrade dependencies to the latest version."
26
+ cmds:
27
+ - uv sync --upgrade
28
+ silent: true
29
+
30
+ 110-format:
31
+ desc: "[PROJECT] Python format with isort and Ruff."
32
+ cmds:
33
+ - uv run isort . --gitignore
34
+ - uv run ruff check --fix
35
+ - uv run ruff format
36
+ silent: true
37
+
38
+ 120-lint:
39
+ desc: "[PROJECT] Python lint with Ruff."
40
+ cmds:
41
+ - uv run ruff check
42
+ - uv run ruff format --check
43
+ silent: true
44
+
45
+ 130-type-check:
46
+ desc: "[PROJECT] Static typing for Python."
47
+ cmds:
48
+ - echo "mypy" && echo "===="
49
+ - uv run mypy --strict src/ tests/
50
+ - echo "" && echo "pyrefly" && echo "======="
51
+ - uv run pyrefly check --summarize-errors
52
+ silent: true
53
+
54
+ 140-audit-deps:
55
+ desc: "[PROJECT] Audit Python dependencies for known CVEs (PyPA advisory DB)."
56
+ cmds:
57
+ - uv run --with pip-audit pip-audit --desc
58
+
59
+ 220-run-tests:
60
+ desc: "[PROJECT] Run Pytest tests with coverage."
61
+ cmds:
62
+ - uv run pytest --cov --cov-report html:reports/cov --cov-report term
63
+ silent: true
64
+
65
+ 300-doc-serve:
66
+ desc: "[PROJECT] Serve the mkdocs documentation site locally on port 8000."
67
+ cmds:
68
+ - uv run mkdocs serve
69
+ silent: true
70
+
71
+ 800-project-set-version:
72
+ desc: "[PROJECT] Set version in different files. Arguments: VERSION|V=x.y.z"
73
+ vars:
74
+ PY_FILE_VERSION: src/task2md/task2md.py
75
+ MD_FILE_VERSION: docs/index.md
76
+ VERSION: '{{default .V .VERSION}}'
77
+ cmds:
78
+ - echo "Version {{.VERSION}}"
79
+ - sed -i.bu "s/0\.0\.0/{{.VERSION}}/g" pyproject.toml
80
+ - defer: rm -f pyproject.toml.bu
81
+ - sed -i.bu "s/0\.0\.0/{{.VERSION}}/g" {{.PY_FILE_VERSION}}
82
+ - defer: rm -f {{.PY_FILE_VERSION}}.bu
83
+ - sed -i.bu "s/0\.0\.0/{{.VERSION}}/g" {{.MD_FILE_VERSION}}
84
+ - defer: rm -f {{.MD_FILE_VERSION}}.bu
85
+ preconditions:
86
+ - sh: test -n "{{.VERSION}}"
87
+ msg: "VERSION|V argument is required"
88
+ silent: true
89
+
90
+ 999-pre-commit:
91
+ desc: "[PROJECT] Pre-commit checks."
92
+ cmds:
93
+ - date > {{.FILE_TASK_START}}
94
+ - defer: rm -f {{.FILE_TASK_START}}
95
+ - task lint:pre-commit
96
+ - echo "" && echo "Markdown:" && echo "========="
97
+ - task lint:markdown GLOB='"**/*.md" "#.cache" "#.superpowers" "#.venv" "#docs" "#Taskfile.d" "#styles"'
98
+ - echo "" && echo "YAML:" && echo "====="
99
+ - task lint:yaml
100
+ - echo "" && echo "Lychee:" && echo "======="
101
+ - task lint:lychee
102
+ - echo "" && echo "Python:" && echo "======="
103
+ - task 00:120-lint
104
+ - task 00:130-type-check
105
+ - echo "" && echo "Tokei:" && echo "====="
106
+ - task lint:tokei
107
+ - echo "" && echo "Checks Start $(cat {{.FILE_TASK_START}}) - End $(date)"
108
+ silent: true
@@ -5,6 +5,8 @@
5
5
  #
6
6
  version: '3'
7
7
 
8
+ dotenv: ['.env']
9
+
8
10
  vars:
9
11
  DIR_TASKFILES: Taskfile.d
10
12
  FILE_TASK_START: "task-start-{{.TASK}}.txt"
@@ -39,13 +41,13 @@ tasks:
39
41
  Requirements:
40
42
  - wget or curl
41
43
  vars:
42
- PROXY: '{{default .P .PROXY}}'
43
- D_PROXY: '{{default .TASK_PROXY .PROXY}}'
44
- PROXY_CREDENTIALS: '{{default .PC .PROXY_CREDENTIALS}}'
44
+ PROXY: '{{.PROXY | default .P}}'
45
+ D_PROXY: '{{.PROXY | default .TASK_PROXY}}'
46
+ PROXY_CREDENTIALS: '{{.PROXY_CREDENTIALS | default .PC}}'
45
47
  TASK_TEMPLATES:
46
48
  sh: task 00:00-get-list-templates
47
- FILE: '{{default .F .FILE}}'
48
- D_FILE: '{{default "Taskfile.yml" .FILE}}'
49
+ FILE: '{{.FILE | default .F}}'
50
+ D_FILE: '{{.FILE | default "Taskfile.yml"}}'
49
51
  BEGIN: " # BEGIN-INCLUDES-TEMPLATES"
50
52
  PATTERN_BEGIN: "^{{.BEGIN}}"
51
53
  END: "# END-INCLUDES-TEMPLATES"
@@ -92,18 +94,18 @@ tasks:
92
94
  silent: true
93
95
 
94
96
  usage:
95
- desc: "[CORE] Show the usage of a task. Arguments: TSK|T=task-name [FILE|F=Taskfile.dist.yml] (*)"
97
+ desc: "[CORE] Show the usage of a task. Arguments: TSK|T=task-name [FILE|F=Taskfile.yml] (*)"
96
98
  summary: |
97
99
  [CORE] Show the usage of a task.
98
- Usage: task [-t Taskfile.dist.yml] usage TSK|T=<task-name> [FILE|F=Taskfile.dist.yml]
100
+ Usage: task [-t Taskfile.yml] usage TSK|T=<task-name> [FILE|F=Taskfile.yml]
99
101
 
100
102
  Arguments:
101
103
  TSK | T Name of the task (required)
102
104
  FILE | F Taskfile path (optional, by default Taskfile.yml)
103
105
  vars:
104
- TSK: '{{default .T .TSK}}'
105
- FILE: '{{default .F .FILE}}'
106
- D_FILE: '{{default "Taskfile.yml" .FILE}}'
106
+ TSK: '{{.TSK | default .T}}'
107
+ FILE: '{{.FILE | default .F}}'
108
+ D_FILE: '{{.FILE | default "Taskfile.yml"}}'
107
109
  cmds:
108
110
  - |
109
111
  if [ ! -f "{{.D_FILE}}" ]; then
@@ -125,8 +127,8 @@ tasks:
125
127
  Arguments:
126
128
  FILE | F Taskfile project path (optional, by default Taskfile.project.yml)
127
129
  vars:
128
- FILE: '{{default .F .FILE}}'
129
- D_FILE: '{{default "Taskfile.project.yml" .FILE}}'
130
+ FILE: '{{.FILE | default .F}}'
131
+ D_FILE: '{{.FILE | default "Taskfile.project.yml"}}'
130
132
  cmds:
131
133
  - |
132
134
  if [ -d "{{.DIR_TASKFILES}}" ]; then
@@ -4,7 +4,7 @@ This page provides documentation for the command line `task2md` application.
4
4
 
5
5
  ::: mkdocs-click
6
6
  :module: task2md.task2md
7
- :command: dir
7
+ :command: dir_command
8
8
 
9
9
  ::: mkdocs-click
10
10
  :module: task2md.task2md
@@ -1,6 +1,6 @@
1
1
  # Overview
2
2
 
3
- Version: 1.1.2
3
+ Version: 1.2.0
4
4
 
5
5
  A CLI tool to generate from [Task](https://taskfile.dev/) files, some markdown
6
6
  documentation files for [`mkdocs`](https://squidfunk.github.io/mkdocs-material/) static site.
@@ -8,6 +8,10 @@ plugins:
8
8
  - search
9
9
  - mkdocstrings
10
10
 
11
+ # Design specs and implementation plans live under docs/ but must not be published.
12
+ exclude_docs: |
13
+ superpowers/
14
+
11
15
  markdown_extensions:
12
16
  - mkdocs-click
13
17
 
@@ -0,0 +1,97 @@
1
+ [project]
2
+ name = "task2md"
3
+ version = "1.2.0"
4
+ description = "A program to generate markdown documentation files from Task files"
5
+ authors = [
6
+ { name = "FX Soubirou", email = "soubirou@yahoo.fr" }
7
+ ]
8
+ license = { text = "MIT" }
9
+ readme = "README.md"
10
+ classifiers = [
11
+ "Programming Language :: Python :: 3",
12
+ "Programming Language :: Python :: 3.14",
13
+ "License :: OSI Approved :: MIT License",
14
+ "Operating System :: OS Independent",
15
+ ]
16
+ dependencies = [
17
+ "click>=8.4.2",
18
+ "pydantic>=2.13.4",
19
+ "PyYAML>=6.0.3",
20
+ ]
21
+ requires-python = ">=3.14"
22
+
23
+ [project.urls]
24
+ Homepage = "https://gitlab.com/op_so/task/task2md"
25
+ Documentation = "https://op_so.gitlab.io/task/task2md/"
26
+
27
+ [project.scripts]
28
+ task2md = "task2md.task2md:cli"
29
+
30
+ [build-system]
31
+ requires = ["hatchling"]
32
+ build-backend = "hatchling.build"
33
+
34
+ [dependency-groups]
35
+ dev = [
36
+ "isort>=8.0.1",
37
+ "mkdocs-click>=0.9.0",
38
+ "mkdocs-material>=9.7.7",
39
+ "mkdocstrings[python]>=1.0.6",
40
+ "mypy>=2.3.0",
41
+ "pyrefly>=1.1.1",
42
+ "pytest>=9.1.1",
43
+ "pytest-cov>=7.1.0",
44
+ "ruff>=0.16.0",
45
+ "types-PyYAML>=6.0.12.20260724",
46
+ ]
47
+
48
+ [tool.hatch.metadata]
49
+ allow-direct-references = true
50
+
51
+ [tool.hatch.build.targets.wheel]
52
+ packages = ["src/task2md"]
53
+
54
+ [tool.coverage.report]
55
+ show_missing = true
56
+
57
+ [tool.coverage.run]
58
+ source = ["src"]
59
+
60
+ [tool.isort]
61
+ profile = "black"
62
+
63
+ [tool.mypy]
64
+ mypy_path = "src"
65
+ strict = true
66
+
67
+ [tool.pyrefly]
68
+ project-includes = ["src", "tests"]
69
+
70
+ [tool.pytest.ini_options]
71
+ testpaths = ["tests"]
72
+
73
+ [tool.ruff]
74
+ target-version = "py314"
75
+ line-length = 88
76
+
77
+ [tool.ruff.lint]
78
+ # E501 replaces the former flake8 `max-line-length = 88`: ruff does not enable
79
+ # it by default, and `ruff format` alone does not wrap comments or long strings.
80
+ extend-select = [
81
+ "A", # flake8-builtins: shadowing a builtin
82
+ "ARG", # flake8-unused-arguments
83
+ "B", # flake8-bugbear
84
+ "C4", # flake8-comprehensions
85
+ "E501", # line-too-long
86
+ "N", # pep8-naming
87
+ "PL", # pylint
88
+ "PTH", # flake8-use-pathlib
89
+ "RET", # flake8-return
90
+ "SIM", # flake8-simplify
91
+ "W", # pycodestyle warnings
92
+ ]
93
+
94
+ [tool.ruff.lint.per-file-ignores]
95
+ # Comparing against literals (exit_code == 2, len(...) == 4) is what an
96
+ # assertion is; naming those values would obscure the tests, not clarify them.
97
+ "tests/**" = ["PLR2004"]
@@ -0,0 +1,43 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "extends": ["config:recommended"],
4
+ "timezone": "Europe/Paris",
5
+ "labels": ["renovate"],
6
+ "semanticCommits": "enabled",
7
+ "dependencyDashboardOSVVulnerabilitySummary": "unresolved",
8
+ "pre-commit": {
9
+ "enabled": true
10
+ },
11
+ "packageRules": [
12
+ {
13
+ "description": "Auto-merge everything but majors",
14
+ "matchUpdateTypes": ["minor", "patch", "digest", "pin", "pinDigest"],
15
+ "automerge": true
16
+ },
17
+ {
18
+ "description": "Majors are reviewed by hand",
19
+ "matchUpdateTypes": ["major"],
20
+ "automerge": false
21
+ },
22
+ {
23
+ "description": "op_so components are released in lockstep: one MR for all",
24
+ "matchManagers": ["gitlabci"],
25
+ "groupName": "op_so components"
26
+ },
27
+ {
28
+ "description": "Dev tooling moves fast and never ships to users: one MR",
29
+ "matchDepTypes": ["dev"],
30
+ "groupName": "dev dependencies",
31
+ "semanticCommitType": "chore"
32
+ },
33
+ {
34
+ "description": "Runtime dependency bumps also raise the pyproject.toml lower bound, so they trigger a fix release instead of a silent lockfile-only chore",
35
+ "matchManagers": ["pep621"],
36
+ "matchDepTypes": ["project.dependencies"],
37
+ "rangeStrategy": "bump"
38
+ }
39
+ ],
40
+ "lockFileMaintenance": {
41
+ "enabled": true
42
+ }
43
+ }