Skip to content
This repository was archived by the owner on Jun 2, 2026. It is now read-only.

Commit cda7785

Browse files
committed
Merge remote-tracking branch 'origin/main' into fix/cli-max-records-limit
2 parents fe5f579 + 2a12e36 commit cda7785

79 files changed

Lines changed: 3688 additions & 480 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/change_version.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
VERSION_PY = Path(__file__).parent.parent / 'defectdojo_api_generated' / '__init__.py'
88
VERSION_RE = re.compile(r"__version__ = '(.*?)'")
9+
CLI_DEPENDENCY_PYPROJECT = Path(__file__).parent.parent / 'packages' / 'cli' / 'pyproject.toml'
10+
CLI_VERSION_RE = re.compile(r'(^version = ")([^"]+)(")', re.MULTILINE)
11+
CLI_DEPENDENCY_RE = re.compile(r'("defectdojo-api-generated==)([^"]+)(")')
912

1013

1114
def main():
@@ -22,6 +25,9 @@ def main():
2225

2326
if args.set:
2427
VERSION_PY.write_text(VERSION_RE.sub(f"__version__ = '{args.set}'", data))
28+
cli_pyproject_data = CLI_DEPENDENCY_PYPROJECT.read_text()
29+
cli_pyproject_data = CLI_VERSION_RE.sub(rf'\g<1>{args.set}\g<3>', cli_pyproject_data)
30+
CLI_DEPENDENCY_PYPROJECT.write_text(CLI_DEPENDENCY_RE.sub(rf'\g<1>{args.set}\g<3>', cli_pyproject_data))
2531
print(f'New version: {args.set}')
2632

2733

.github/workflows/publish.yml

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,21 +57,41 @@ jobs:
5757
run: |
5858
.github/change_version.py --set '${{ inputs.version }}'
5959
- name: Build
60-
run: uv run pyproject-build
60+
run: |
61+
rm -rf dist packages/cli/dist
62+
uv run pyproject-build
63+
uv run pyproject-build packages/cli
6164
- name: Publish
6265
env:
6366
TWINE_USERNAME: __token__
6467
TWINE_PASSWORD: ${{ secrets.twine_token }}
65-
run: uv run twine upload --verbose --repository ${{ inputs.repository }} dist/*
68+
run: uv run twine upload --verbose --repository ${{ inputs.repository }} dist/* packages/cli/dist/*
6669
- name: highlight
6770
run: |
6871
INDEX=""
6972
if [ "${{ inputs.repository }}" != "pypi" ]; then
7073
INDEX=" -i ${{ inputs.repository }}"
7174
fi
7275
cat <<EOF >> ${GITHUB_STEP_SUMMARY}
73-
\`example\` uploaded to ${{ inputs.repository }}
76+
Packages uploaded to ${{ inputs.repository }}
7477
\`\`\`
7578
pip install${INDEX} defectdojo-api-generated==${{ inputs.version }}
79+
pip install${INDEX} defectdojo-cli==${{ inputs.version }}
80+
\`\`\`
81+
EOF
82+
if [ "${{ inputs.repository }}" != "pypi" ]; then
83+
cat <<EOF >> ${GITHUB_STEP_SUMMARY}
84+
Run with \`uvx\`
85+
\`\`\`
86+
uvx --with 'defectdojo-api-generated @ https://test-files.pythonhosted.org/packages/source/d/defectdojo-api-generated/defectdojo_api_generated-${{ inputs.version }}.tar.gz' \\
87+
'defectdojo-cli @ https://test-files.pythonhosted.org/packages/source/d/defectdojo-cli/defectdojo_cli-${{ inputs.version }}.tar.gz'
7688
\`\`\`
7789
EOF
90+
else
91+
cat <<EOF >> ${GITHUB_STEP_SUMMARY}
92+
Run with \`uvx\`
93+
\`\`\`
94+
uvx defectdojo-cli==${{ inputs.version }}
95+
\`\`\`
96+
EOF
97+
fi

.github/workflows/test.yml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ jobs:
3333
run: |
3434
make lint-check
3535
36+
- name: Build CLI package
37+
run: |
38+
uv run pyproject-build packages/cli
39+
3640
unit-tests:
3741
runs-on: ubuntu-latest
3842
strategy:
@@ -50,7 +54,7 @@ jobs:
5054
- name: Install dependencies
5155
run: |
5256
pip install uv
53-
uv sync --dev --extra cli
57+
uv sync --dev
5458
5559
- name: Run unit tests
5660
run: |
@@ -76,7 +80,7 @@ jobs:
7680
- name: Install dependencies
7781
run: |
7882
pip install uv
79-
uv sync --dev --extra cli
83+
uv sync --dev
8084
8185
- name: Run e2e tests
8286
run: |
@@ -96,7 +100,7 @@ jobs:
96100
- name: Install dependencies
97101
run: |
98102
pip install uv
99-
uv sync --dev --extra cli
103+
uv sync --dev
100104
101105
- name: build docs
102106
run: |

.openapi-generator/FILES

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ defectdojo_api_generated/api/asset_api_scan_configurations_api.py
66
defectdojo_api_generated/api/asset_groups_api.py
77
defectdojo_api_generated/api/asset_members_api.py
88
defectdojo_api_generated/api/assets_api.py
9+
defectdojo_api_generated/api/celery_api.py
910
defectdojo_api_generated/api/configuration_permissions_api.py
1011
defectdojo_api_generated/api/credential_mappings_api.py
1112
defectdojo_api_generated/api/credentials_api.py
@@ -106,6 +107,11 @@ defectdojo_api_generated/docs/BurpRawRequestResponse.md
106107
defectdojo_api_generated/docs/BurpRawRequestResponseMulti.md
107108
defectdojo_api_generated/docs/BurpRawRequestResponseMultiRequest.md
108109
defectdojo_api_generated/docs/BurpRawRequestResponseRequest.md
110+
defectdojo_api_generated/docs/CeleryApi.md
111+
defectdojo_api_generated/docs/CeleryQueuePurgeCreate200Response.md
112+
defectdojo_api_generated/docs/CeleryQueueTaskDetail.md
113+
defectdojo_api_generated/docs/CeleryQueueTaskPurgeCreateRequest.md
114+
defectdojo_api_generated/docs/CeleryStatus.md
109115
defectdojo_api_generated/docs/ConfigurationPermission.md
110116
defectdojo_api_generated/docs/ConfigurationPermissionsApi.md
111117
defectdojo_api_generated/docs/Credential.md
@@ -176,6 +182,7 @@ defectdojo_api_generated/docs/FindingTest.md
176182
defectdojo_api_generated/docs/FindingTestType.md
177183
defectdojo_api_generated/docs/FindingToFiles.md
178184
defectdojo_api_generated/docs/FindingToNotes.md
185+
defectdojo_api_generated/docs/FindingVerifyRequest.md
179186
defectdojo_api_generated/docs/FindingsApi.md
180187
defectdojo_api_generated/docs/GlobalRole.md
181188
defectdojo_api_generated/docs/GlobalRoleRequest.md
@@ -496,6 +503,10 @@ defectdojo_api_generated/models/burp_raw_request_response.py
496503
defectdojo_api_generated/models/burp_raw_request_response_multi.py
497504
defectdojo_api_generated/models/burp_raw_request_response_multi_request.py
498505
defectdojo_api_generated/models/burp_raw_request_response_request.py
506+
defectdojo_api_generated/models/celery_queue_purge_create200_response.py
507+
defectdojo_api_generated/models/celery_queue_task_detail.py
508+
defectdojo_api_generated/models/celery_queue_task_purge_create_request.py
509+
defectdojo_api_generated/models/celery_status.py
499510
defectdojo_api_generated/models/configuration_permission.py
500511
defectdojo_api_generated/models/credential.py
501512
defectdojo_api_generated/models/credential_mapping.py
@@ -554,6 +565,7 @@ defectdojo_api_generated/models/finding_test.py
554565
defectdojo_api_generated/models/finding_test_type.py
555566
defectdojo_api_generated/models/finding_to_files.py
556567
defectdojo_api_generated/models/finding_to_notes.py
568+
defectdojo_api_generated/models/finding_verify_request.py
557569
defectdojo_api_generated/models/global_role.py
558570
defectdojo_api_generated/models/global_role_request.py
559571
defectdojo_api_generated/models/import_languages.py
@@ -827,6 +839,11 @@ defectdojo_api_generated/test/test_burp_raw_request_response.py
827839
defectdojo_api_generated/test/test_burp_raw_request_response_multi.py
828840
defectdojo_api_generated/test/test_burp_raw_request_response_multi_request.py
829841
defectdojo_api_generated/test/test_burp_raw_request_response_request.py
842+
defectdojo_api_generated/test/test_celery_api.py
843+
defectdojo_api_generated/test/test_celery_queue_purge_create200_response.py
844+
defectdojo_api_generated/test/test_celery_queue_task_detail.py
845+
defectdojo_api_generated/test/test_celery_queue_task_purge_create_request.py
846+
defectdojo_api_generated/test/test_celery_status.py
830847
defectdojo_api_generated/test/test_configuration_permission.py
831848
defectdojo_api_generated/test/test_configuration_permissions_api.py
832849
defectdojo_api_generated/test/test_credential.py
@@ -897,6 +914,7 @@ defectdojo_api_generated/test/test_finding_test.py
897914
defectdojo_api_generated/test/test_finding_test_type.py
898915
defectdojo_api_generated/test/test_finding_to_files.py
899916
defectdojo_api_generated/test/test_finding_to_notes.py
917+
defectdojo_api_generated/test/test_finding_verify_request.py
900918
defectdojo_api_generated/test/test_findings_api.py
901919
defectdojo_api_generated/test/test_global_role.py
902920
defectdojo_api_generated/test/test_global_role_request.py

.readthedocs.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ build:
99
os: ubuntu-24.04
1010
tools:
1111
python: "3.13"
12+
jobs:
13+
post_install:
14+
- pip install uv
15+
- UV_PROJECT_ENVIRONMENT=$READTHEDOCS_VIRTUALENV_PATH uv sync --dev --all-extras
1216

1317
# Build documentation with Mkdocs
1418
mkdocs:

AGENTS.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,11 @@ Formatting and lint:
121121
- `make lint`
122122
- `make lint-check`
123123

124+
Repo-specific expectation:
125+
126+
- After any code, template, packaging, or GitHub Actions change, run `make lint`.
127+
- Do not treat `make lint` as optional or defer it unless the user explicitly asks not to run it or you are blocked.
128+
124129
Tests:
125130

126131
- `make test`

CONTRIBUTING.md

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,22 @@
33
This project uses `uv`, so set up the virtualenv by running
44

55
```
6-
uv sync --dev --extra cli
6+
uv sync --dev
77
```
88

99
Use `make test` to make sure all tests pass before pushing.
1010

1111
Use `make lint` to make sure lint check passes before pushing.
1212

13+
## Packaging layout
14+
15+
The main package, `defectdojo-api-generated`, is intentionally library-only.
16+
It does not publish console scripts and should remain installable without CLI-only dependencies.
17+
18+
The `dojo` entrypoint lives in the thin wrapper package under `packages/cli/`.
19+
That package depends on the main library plus the CLI stack and should stay small:
20+
keep CLI packaging, entrypoints, and CLI-only dependency wiring there, while the actual CLI implementation can continue to live under `defectdojo_api_generated/cli/`.
21+
1322
## Guidelines
1423

1524
### Update openapi-generator version
@@ -28,5 +37,5 @@ Use `make lint` to make sure lint check passes before pushing.
2837

2938
### Update Dojo OpenAPI schema
3039

31-
* Run `support/openapi/fetch_openapi.py` to refresh local copy
32-
* `make generate`
40+
* `make schema` to refresh local copy and update API changelog
41+
* `make generate` to generate classes

Makefile

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ lint-check:
66
uv run ruff format --diff
77
uv run ruff check
88

9+
sync:
10+
uv sync --dev --all-extras
11+
912
.venv39: export VIRTUAL_ENV=.venv39
1013
.venv39:
11-
uv sync --dev --extra cli --python 3.9 --active
14+
uv sync --dev --all-extras --python 3.9 --active
1215

1316
test39: .venv39
1417
test39: export VIRTUAL_ENV=.venv39
@@ -33,9 +36,10 @@ test-e2e:
3336
uv run pytest tests/integration
3437

3538
testpub:
36-
rm -fr dist
39+
rm -rf dist packages/cli/dist
3740
uv run pyproject-build
38-
uv run twine upload --repository testpypi dist/*
41+
uv run pyproject-build packages/cli
42+
uv run twine upload --repository testpypi dist/* packages/cli/dist/*
3943

4044
schema:
4145
uv run ./support/openapi/fetch_openapi.py --output ./support/openapi/openapi-new.json
@@ -46,11 +50,15 @@ templates:
4650
./support/api_generation/dump_templates.sh
4751

4852
# random generated file as target, just for timestamp
49-
defectdojo_api_generated/configuration.py: support/api_generation/custom_templates/*
53+
defectdojo_api_generated/configuration.py: support/api_generation/custom_templates/* support/openapi/openapi.json
5054
./support/api_generation/generate.sh
5155
$(MAKE) lint
5256

5357
generate: defectdojo_api_generated/configuration.py
5458

59+
schema-mr: schema generate
60+
schema-mr:
61+
echo "Updated, now create and push branch update/schema-$(shell cat ./support/openapi/openapi.json | jq -r .info.version)"
62+
5563
test-docs: generate
5664
uv run mkdocs serve

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ Multiple changes done on top of default openapi-generator:
1616
* Remove most of pydantic/schema validations due to inconsistencies with actual database schema/requirements (tracked in https://github.com/fopina/defectdojo-api-generated/issues/39)
1717
* *Iterator* methods for every *list* API method to handle pagination automatically
1818
* A nice CLI exposing all the API methods <3
19-
* installed only as an extra, to keep everything clean when package is used as library only
19+
* published as `defectdojo-cli`, a separate package to keep library-only installs free of console-script conflicts
2020

2121
## Example
2222

2323
### Library
2424

2525
```
26-
pip install defectojo-api-generated
26+
pip install defectdojo-api-generated
2727
```
2828

2929
<!-- example-id: example.py -->
@@ -49,7 +49,7 @@ pip install defectojo-api-generated
4949
> [uv](https://docs.astral.sh/uv/) recommended or [pipx](https://github.com/pypa/pipx)
5050
5151
```
52-
uv tool install 'defectojo-api-generated[cli]'
52+
uv tool install defectdojo-cli
5353
```
5454

5555
```
@@ -69,7 +69,7 @@ Commands:
6969
You can also skip tool install and just run it with:
7070

7171
```
72-
$ uvx 'defectojo-api-generated[cli]'
72+
$ uvx defectdojo-cli
7373
Usage: dojo [OPTIONS] COMMAND [ARGS]...
7474
...
7575
```

defectdojo_api_generated/__init__.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
'AssetGroupsApi',
2323
'AssetMembersApi',
2424
'AssetsApi',
25+
'CeleryApi',
2526
'ConfigurationPermissionsApi',
2627
'CredentialMappingsApi',
2728
'CredentialsApi',
@@ -122,6 +123,10 @@
122123
'BurpRawRequestResponseMulti',
123124
'BurpRawRequestResponseMultiRequest',
124125
'BurpRawRequestResponseRequest',
126+
'CeleryQueuePurgeCreate200Response',
127+
'CeleryQueueTaskDetail',
128+
'CeleryQueueTaskPurgeCreateRequest',
129+
'CeleryStatus',
125130
'ConfigurationPermission',
126131
'Credential',
127132
'CredentialMapping',
@@ -180,6 +185,7 @@
180185
'FindingTestType',
181186
'FindingToFiles',
182187
'FindingToNotes',
188+
'FindingVerifyRequest',
183189
'GlobalRole',
184190
'GlobalRoleRequest',
185191
'ImportLanguages',
@@ -433,6 +439,7 @@
433439
from defectdojo_api_generated.api.asset_groups_api import AssetGroupsApi as AssetGroupsApi
434440
from defectdojo_api_generated.api.asset_members_api import AssetMembersApi as AssetMembersApi
435441
from defectdojo_api_generated.api.assets_api import AssetsApi as AssetsApi
442+
from defectdojo_api_generated.api.celery_api import CeleryApi as CeleryApi
436443
from defectdojo_api_generated.api.configuration_permissions_api import (
437444
ConfigurationPermissionsApi as ConfigurationPermissionsApi,
438445
)
@@ -566,6 +573,14 @@
566573
from defectdojo_api_generated.models.burp_raw_request_response_request import (
567574
BurpRawRequestResponseRequest as BurpRawRequestResponseRequest,
568575
)
576+
from defectdojo_api_generated.models.celery_queue_purge_create200_response import (
577+
CeleryQueuePurgeCreate200Response as CeleryQueuePurgeCreate200Response,
578+
)
579+
from defectdojo_api_generated.models.celery_queue_task_detail import CeleryQueueTaskDetail as CeleryQueueTaskDetail
580+
from defectdojo_api_generated.models.celery_queue_task_purge_create_request import (
581+
CeleryQueueTaskPurgeCreateRequest as CeleryQueueTaskPurgeCreateRequest,
582+
)
583+
from defectdojo_api_generated.models.celery_status import CeleryStatus as CeleryStatus
569584
from defectdojo_api_generated.models.configuration_permission import ConfigurationPermission as ConfigurationPermission
570585
from defectdojo_api_generated.models.credential import Credential as Credential
571586
from defectdojo_api_generated.models.credential_mapping import CredentialMapping as CredentialMapping
@@ -640,6 +655,7 @@
640655
from defectdojo_api_generated.models.finding_test_type import FindingTestType as FindingTestType
641656
from defectdojo_api_generated.models.finding_to_files import FindingToFiles as FindingToFiles
642657
from defectdojo_api_generated.models.finding_to_notes import FindingToNotes as FindingToNotes
658+
from defectdojo_api_generated.models.finding_verify_request import FindingVerifyRequest as FindingVerifyRequest
643659
from defectdojo_api_generated.models.global_role import GlobalRole as GlobalRole
644660
from defectdojo_api_generated.models.global_role_request import GlobalRoleRequest as GlobalRoleRequest
645661
from defectdojo_api_generated.models.import_languages import ImportLanguages as ImportLanguages

0 commit comments

Comments
 (0)