devrev-Python-SDK 2.8.0__tar.gz → 2.9.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.
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/workflows/ci.yml +1 -1
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/workflows/integration-tests.yml +1 -1
- devrev_python_sdk-2.9.0/CLAUDE.md +4 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/PKG-INFO +11 -1
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/README.md +7 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/services/articles.md +32 -4
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/changelog.md +15 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/mcp/tools-reference.md +1 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/pyproject.toml +5 -2
- devrev_python_sdk-2.9.0/src/devrev/models/articles.py +341 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/artifacts.py +6 -4
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/articles.py +310 -101
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/artifacts.py +1 -3
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/base.py +1 -3
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/utils/__init__.py +2 -0
- devrev_python_sdk-2.9.0/src/devrev/utils/content_converter.py +358 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/articles.py +9 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_all_readonly_endpoints.py +3 -1
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_articles_lifecycle.py +178 -47
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_get_endpoints.py +3 -2
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/performance/test_articles_performance.py +6 -5
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/conftest.py +2 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_articles.py +59 -11
- devrev_python_sdk-2.9.0/tests/unit/services/test_articles.py +274 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_async_services.py +2 -2
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/test_articles_unified.py +290 -190
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/test_backward_compatibility.py +7 -8
- devrev_python_sdk-2.9.0/tests/unit/test_content_converter.py +504 -0
- devrev_python_sdk-2.8.0/src/devrev/models/articles.py +0 -149
- devrev_python_sdk-2.8.0/tests/unit/services/test_articles.py +0 -141
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/agents/bug-fixer.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/agents/builder.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/agents/documentation.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/agents/foreman.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/agents/pr-review-boss.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/agents/release-manager.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/agents/simplifier.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/agents/tester.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/commands/foreman-work.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/commands/release-prepare.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/commands/review-start.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/commands/simplify-code.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/rules/code-quality.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/rules/data-modeling.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/rules/devrev-sdk.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/rules/git-workflow.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/rules/pull-requests.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/rules/python-development.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/rules/security.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.augment/rules/testing.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.dockerignore +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.env.sample +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/article-artifact-simplification.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/dependabot.yml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/pull_request_template.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/workflows/api-check.yml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/workflows/claude-code-review.yml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/workflows/claude.yml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/workflows/deploy.yml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/workflows/docs.yml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/workflows/release.yml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.github/workflows/sync-openapi.yml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.gitignore +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/.pre-commit-config.yaml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/CODE_OF_CONDUCT.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/CONTRIBUTING.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/DEPRECATIONS.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/Dockerfile +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/KNOWN_ISSUES.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/OPENAPI_SPEC_DISCREPANCIES.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/SECURITY.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/augment-mcp-config-remote.json +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/augment-mcp-config.json +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/augment-settings.json +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/benchmarks/README.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/benchmarks/bench_http_client.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/benchmarks/bench_models.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/benchmarks/bench_pagination.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/benchmarks/conftest.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/context7.json +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/deploy/README.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/deploy/audit-logging-setup.sh +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/deploy/cloudbuild.yaml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/deploy/monitoring/README.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/deploy/monitoring/alert-policies.yaml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/deploy/monitoring/dashboard.json +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/deploy/monitoring/validate-config.sh +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/deploy/service.yaml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docker-compose.yml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/beta/brands.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/beta/engagements.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/beta/incidents.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/beta/index.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/beta/question-answers.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/beta/recommendations.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/beta/search.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/beta/uoms.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/beta-api-differences.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/client.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/config.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/exceptions.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/index.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/models/accounts.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/models/base.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/models/index.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/models/users.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/models/works.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/services/accounts.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/services/code-changes.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/services/conversations.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/services/dev-users.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/services/groups.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/services/index.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/services/links.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/services/parts.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/services/rev-users.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/services/slas.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/services/tags.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/services/timeline-entries.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/services/webhooks.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/api/services/works.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/examples/advanced.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/examples/basic.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/examples/beta-features.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/examples/index.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/examples/integrations.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/getting-started/authentication.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/getting-started/index.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/getting-started/installation.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/getting-started/quickstart.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/guides/beta-api.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/guides/compatibility.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/guides/configuration.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/guides/error-handling.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/guides/github-actions-setup.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/guides/index.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/guides/logging.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/guides/pagination.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/guides/sync-vs-async.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/guides/testing.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/guides/version-support.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/guides/write-integration-testing-strategy.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/hooks/copy_llms.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/index.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/mcp/deployment.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/mcp/index.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/mcp/quickstart.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/docs/stylesheets/extra.css +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/README.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/basic/README.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/basic/async_example.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/basic/create_work.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/basic/error_handling.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/basic/list_accounts.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/basic/pagination.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/basic/search_users.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/integrations/cloud_functions/README.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/integrations/cloud_functions/main.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/integrations/cloud_functions/requirements.txt +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/integrations/fastapi/README.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/integrations/fastapi/main.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/integrations/fastapi/requirements.txt +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/integrations/flask/README.md +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/integrations/flask/app.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/examples/integrations/flask/requirements.txt +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/llms-ctx-full.txt +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/llms-ctx.txt +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/llms-mcp.txt +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/llms.txt +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/mkdocs.yml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/openapi-beta.yaml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/openapi-public.yaml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/openapi-spec-corrections.yaml +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/scripts/build_ai_docs.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/scripts/setup-github-secrets.sh +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/client.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/config.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/exceptions.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/accounts.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/base.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/brands.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/code_changes.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/conversations.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/dev_users.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/engagements.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/groups.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/incidents.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/links.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/notifications.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/parts.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/preferences.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/question_answers.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/recommendations.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/rev_users.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/search.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/slas.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/sync.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/tags.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/tasks.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/timeline_entries.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/timeline_events.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/track_events.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/uoms.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/webhooks.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/widgets.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/models/works.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/py.typed +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/accounts.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/brands.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/code_changes.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/conversations.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/dev_users.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/engagements.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/groups.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/incidents.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/links.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/notifications.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/parts.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/preferences.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/question_answers.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/recommendations.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/rev_users.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/search.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/slas.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/tags.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/timeline_entries.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/track_events.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/uoms.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/webhooks.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/services/works.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/utils/deprecation.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/utils/http.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/utils/logging.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev/utils/pagination.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/__main__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/config.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/middleware/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/middleware/audit.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/middleware/auth.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/middleware/health.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/middleware/rate_limit.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/escalation.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/investigate.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/response.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/summarize.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/triage.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/account.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/article.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/conversation.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/part.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/server_info.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/ticket.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/user.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/server.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/accounts.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/conversations.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/engagements.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/groups.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/incidents.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/links.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/parts.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/recommendations.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/search.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/server_info.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/slas.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/tags.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/timeline.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/users.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/works.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/utils/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/utils/errors.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/utils/formatting.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/src/devrev_mcp/utils/pagination.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/conftest.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/conftest.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_accounts_e2e.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_backwards_compatibility.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_contacts_e2e.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_core_services_phase1.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_extended_services_phase2.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_issues_e2e.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_kb_articles_e2e.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_mcp_articles.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_ping.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_question_answers_e2e.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_readonly_endpoints.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_specialized_services_phase3.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_tickets_e2e.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/test_write_operations.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/utils/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/utils/cleanup.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/utils/constants.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/integration/utils/data_manager.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/performance/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_audit.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_config.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_phase4_transport.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_prompts.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_resources.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_server_info.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_accounts.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_conversations.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_engagements.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_groups.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_incidents.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_links.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_parts.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_recommendations.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_search.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_slas.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_tags.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_timeline.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_users.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_works.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_utils.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/models/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/models/test_user_state_regression.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/__init__.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/conftest.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_brands.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_code_changes.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_conversations.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_engagements.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_groups.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_incidents.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_links.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_notifications.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_parts.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_preferences.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_question_answers.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_recommendations.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_search.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_slas.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_tags.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_timeline_entries.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_track_events.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_uoms.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_webhooks.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/services/test_works.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/test_artifacts.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/test_base_service.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/test_client.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/test_config.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/test_deprecation.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/test_error_handling.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/test_exceptions.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/test_http.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/test_logging.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/tests/unit/test_pagination.py +0 -0
- {devrev_python_sdk-2.8.0 → devrev_python_sdk-2.9.0}/uv.lock +0 -0
|
@@ -39,7 +39,7 @@ jobs:
|
|
|
39
39
|
run: python scripts/build_ai_docs.py --verbose
|
|
40
40
|
|
|
41
41
|
- name: Run tests (unit tests only)
|
|
42
|
-
run: pytest --cov=src/devrev --cov-report=xml -v -m "not integration"
|
|
42
|
+
run: pytest --cov=src/devrev --cov-report=xml -v -m "not integration" --ignore=tests/performance
|
|
43
43
|
|
|
44
44
|
- name: Run integration tests (if API token available)
|
|
45
45
|
env:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devrev-Python-SDK
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.9.0
|
|
4
4
|
Summary: A modern, type-safe Python SDK for the DevRev API
|
|
5
5
|
Project-URL: Homepage, https://github.com/mgmonteleone/py-dev-rev
|
|
6
6
|
Project-URL: Documentation, https://github.com/mgmonteleone/py-dev-rev
|
|
@@ -18,7 +18,9 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.13
|
|
19
19
|
Classifier: Typing :: Typed
|
|
20
20
|
Requires-Python: >=3.11
|
|
21
|
+
Requires-Dist: beautifulsoup4>=4.12.0
|
|
21
22
|
Requires-Dist: httpx>=0.25.0
|
|
23
|
+
Requires-Dist: markdown>=3.5.0
|
|
22
24
|
Requires-Dist: pydantic-settings>=2.1.0
|
|
23
25
|
Requires-Dist: pydantic>=2.5.0
|
|
24
26
|
Requires-Dist: python-dotenv>=1.0.0
|
|
@@ -50,6 +52,7 @@ Provides-Extra: dev
|
|
|
50
52
|
Requires-Dist: mypy>=1.7.0; extra == 'dev'
|
|
51
53
|
Requires-Dist: pre-commit>=3.6.0; extra == 'dev'
|
|
52
54
|
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
|
|
55
|
+
Requires-Dist: pytest-benchmark>=4.0.0; extra == 'dev'
|
|
53
56
|
Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
|
|
54
57
|
Requires-Dist: pytest-mock>=3.12.0; extra == 'dev'
|
|
55
58
|
Requires-Dist: pytest<10.0.0,>=7.4.0; extra == 'dev'
|
|
@@ -514,6 +517,7 @@ article = client.articles.create_with_content(
|
|
|
514
517
|
owned_by=["don:identity:dvrv-us-1:devo/1:devu/1"],
|
|
515
518
|
description="Quick start guide for new users", # Optional metadata
|
|
516
519
|
status=ArticleStatus.PUBLISHED,
|
|
520
|
+
applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123"], # Optional: associate with parts
|
|
517
521
|
)
|
|
518
522
|
|
|
519
523
|
# Get article with content
|
|
@@ -535,6 +539,12 @@ client.articles.update_with_content(
|
|
|
535
539
|
status=ArticleStatus.ARCHIVED,
|
|
536
540
|
)
|
|
537
541
|
|
|
542
|
+
# Update with part associations
|
|
543
|
+
client.articles.update_with_content(
|
|
544
|
+
id=article.id,
|
|
545
|
+
applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123", "don:core:dvrv-us-1:devo/1:part/456"],
|
|
546
|
+
)
|
|
547
|
+
|
|
538
548
|
# List published articles (metadata only)
|
|
539
549
|
published = client.articles.list(limit=20)
|
|
540
550
|
for article in published:
|
|
@@ -442,6 +442,7 @@ article = client.articles.create_with_content(
|
|
|
442
442
|
owned_by=["don:identity:dvrv-us-1:devo/1:devu/1"],
|
|
443
443
|
description="Quick start guide for new users", # Optional metadata
|
|
444
444
|
status=ArticleStatus.PUBLISHED,
|
|
445
|
+
applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123"], # Optional: associate with parts
|
|
445
446
|
)
|
|
446
447
|
|
|
447
448
|
# Get article with content
|
|
@@ -463,6 +464,12 @@ client.articles.update_with_content(
|
|
|
463
464
|
status=ArticleStatus.ARCHIVED,
|
|
464
465
|
)
|
|
465
466
|
|
|
467
|
+
# Update with part associations
|
|
468
|
+
client.articles.update_with_content(
|
|
469
|
+
id=article.id,
|
|
470
|
+
applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123", "don:core:dvrv-us-1:devo/1:part/456"],
|
|
471
|
+
)
|
|
472
|
+
|
|
466
473
|
# List published articles (metadata only)
|
|
467
474
|
published = client.articles.list(limit=20)
|
|
468
475
|
for article in published:
|
|
@@ -20,15 +20,36 @@ Manage knowledge base articles in DevRev.
|
|
|
20
20
|
|
|
21
21
|
```python
|
|
22
22
|
from devrev import DevRevClient
|
|
23
|
-
from devrev.models.articles import ArticlesListRequest
|
|
23
|
+
from devrev.models.articles import ArticlesListRequest, ArticleStatus
|
|
24
24
|
|
|
25
25
|
client = DevRevClient()
|
|
26
26
|
|
|
27
|
+
# Simple usage with keyword args
|
|
28
|
+
response = client.articles.list(limit=20)
|
|
29
|
+
for article in response.articles:
|
|
30
|
+
print(f"{article.title}")
|
|
31
|
+
|
|
32
|
+
# Filter by status
|
|
33
|
+
response = client.articles.list(status=[ArticleStatus.DRAFT])
|
|
34
|
+
for article in response.articles:
|
|
35
|
+
print(f"Draft: {article.title}")
|
|
36
|
+
|
|
27
37
|
# Using a request object
|
|
28
|
-
request = ArticlesListRequest(limit=20)
|
|
29
|
-
|
|
30
|
-
for article in articles:
|
|
38
|
+
request = ArticlesListRequest(limit=20, status=[ArticleStatus.PUBLISHED])
|
|
39
|
+
response = client.articles.list(request)
|
|
40
|
+
for article in response.articles:
|
|
31
41
|
print(f"{article.title}")
|
|
42
|
+
|
|
43
|
+
# Paginate through all results using next_cursor
|
|
44
|
+
cursor = None
|
|
45
|
+
all_articles = []
|
|
46
|
+
while True:
|
|
47
|
+
response = client.articles.list(cursor=cursor, limit=100)
|
|
48
|
+
all_articles.extend(response.articles)
|
|
49
|
+
cursor = response.next_cursor
|
|
50
|
+
if not cursor:
|
|
51
|
+
break
|
|
52
|
+
print(f"Total articles: {len(all_articles)}")
|
|
32
53
|
```
|
|
33
54
|
|
|
34
55
|
### Get Article
|
|
@@ -72,6 +93,7 @@ article = client.articles.create_with_content(
|
|
|
72
93
|
description="Short summary for search/listing", # Optional metadata
|
|
73
94
|
status=ArticleStatus.PUBLISHED, # Optional: draft, published, archived
|
|
74
95
|
content_format="text/html", # Optional: default is text/html
|
|
96
|
+
applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123"], # Optional: associate with parts
|
|
75
97
|
)
|
|
76
98
|
print(f"Created article with content: {article.id}")
|
|
77
99
|
```
|
|
@@ -160,6 +182,12 @@ updated_article = client.articles.update_with_content(
|
|
|
160
182
|
id="don:core:dvrv-us-1:devo/1:article/123",
|
|
161
183
|
content="<h1>New Content</h1>",
|
|
162
184
|
)
|
|
185
|
+
|
|
186
|
+
# Update with part associations
|
|
187
|
+
updated_article = client.articles.update_with_content(
|
|
188
|
+
id="don:core:dvrv-us-1:devo/1:article/123",
|
|
189
|
+
applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123", "don:core:dvrv-us-1:devo/1:part/456"],
|
|
190
|
+
)
|
|
163
191
|
```
|
|
164
192
|
|
|
165
193
|
### Async Usage
|
|
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.9.0] - 2026-03-09
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Article Part Association** (#171) — Added `applies_to_parts` parameter to MCP `articles_create` and `articles_update` tools, and SDK `update_with_content` method for native article-to-part association
|
|
15
|
+
|
|
16
|
+
## [2.8.1] - 2026-03-06
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- **CI/CD** — Installed the `mcp` extra in the integration workflow so MCP dependencies are available during integration runs.
|
|
21
|
+
- **Articles integration test** — Updated the articles integration test to match the current response shape.
|
|
22
|
+
|
|
23
|
+
## [2.8.0] - 2026-03-01
|
|
24
|
+
|
|
10
25
|
### Added
|
|
11
26
|
|
|
12
27
|
- **Unified Article Management** (#161) — Simplified article and artifact workflows:
|
|
@@ -56,6 +56,7 @@ Tools are the primary way AI assistants interact with DevRev. Each tool maps to
|
|
|
56
56
|
- **Unified Content Management**: Create and update articles with automatic artifact handling
|
|
57
57
|
- **Optional Content Loading**: Use `include_content=true` in `get` to fetch article body
|
|
58
58
|
- **Clear Parameters**: `content` for article body, `description` for metadata summary
|
|
59
|
+
- **Part Association**: Use `applies_to_parts` to natively associate articles with products, capabilities, features, or enhancements
|
|
59
60
|
|
|
60
61
|
### Conversations
|
|
61
62
|
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "devrev-Python-SDK"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.9.0"
|
|
8
8
|
description = "A modern, type-safe Python SDK for the DevRev API"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -29,13 +29,16 @@ dependencies = [
|
|
|
29
29
|
"pydantic-settings>=2.1.0",
|
|
30
30
|
"httpx>=0.25.0",
|
|
31
31
|
"python-dotenv>=1.0.0",
|
|
32
|
+
"beautifulsoup4>=4.12.0",
|
|
33
|
+
"markdown>=3.5.0",
|
|
32
34
|
]
|
|
33
35
|
|
|
34
36
|
[project.optional-dependencies]
|
|
35
37
|
dev = [
|
|
36
38
|
"pytest>=7.4.0,<10.0.0",
|
|
37
|
-
"pytest-cov>=4.1.0",
|
|
38
39
|
"pytest-asyncio>=0.21.0",
|
|
40
|
+
"pytest-benchmark>=4.0.0",
|
|
41
|
+
"pytest-cov>=4.1.0",
|
|
39
42
|
"pytest-mock>=3.12.0",
|
|
40
43
|
"ruff>=0.1.0",
|
|
41
44
|
"mypy>=1.7.0",
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
"""Article models for DevRev SDK."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from enum import StrEnum
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from pydantic import Field
|
|
10
|
+
|
|
11
|
+
from devrev.models.base import (
|
|
12
|
+
CustomSchemaSpec,
|
|
13
|
+
DevRevBaseModel,
|
|
14
|
+
DevRevResponseModel,
|
|
15
|
+
PaginatedResponse,
|
|
16
|
+
SetTagWithValue,
|
|
17
|
+
UserSummary,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ArticleStatus(StrEnum):
|
|
22
|
+
"""Article status enumeration."""
|
|
23
|
+
|
|
24
|
+
DRAFT = "draft"
|
|
25
|
+
PUBLISHED = "published"
|
|
26
|
+
ARCHIVED = "archived"
|
|
27
|
+
REVIEW_NEEDED = "review_needed"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ArticleAccessLevel(StrEnum):
|
|
31
|
+
"""Article access level enumeration."""
|
|
32
|
+
|
|
33
|
+
EXTERNAL = "external"
|
|
34
|
+
INTERNAL = "internal"
|
|
35
|
+
PRIVATE = "private"
|
|
36
|
+
PUBLIC = "public"
|
|
37
|
+
RESTRICTED = "restricted"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class ArticleType(StrEnum):
|
|
41
|
+
"""Article type enumeration."""
|
|
42
|
+
|
|
43
|
+
ARTICLE = "article"
|
|
44
|
+
CONTENT_BLOCK = "content_block"
|
|
45
|
+
PAGE = "page"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class ArticleContentFormat(StrEnum):
|
|
49
|
+
"""Article content format enumeration."""
|
|
50
|
+
|
|
51
|
+
DRDFV2 = "drdfv2"
|
|
52
|
+
RT = "rt"
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class CursorMode(StrEnum):
|
|
56
|
+
"""Cursor pagination direction."""
|
|
57
|
+
|
|
58
|
+
AFTER = "after"
|
|
59
|
+
BEFORE = "before"
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class ArticleScope(DevRevResponseModel):
|
|
63
|
+
"""Scope/visibility level of an article.
|
|
64
|
+
|
|
65
|
+
Values observed from the API:
|
|
66
|
+
- ``{"id": 1, "label": "internal", "ordinal": 1}``
|
|
67
|
+
- ``{"id": 2, "label": "external", "ordinal": 2}``
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
id: int = Field(..., description="Scope numeric ID (1=internal, 2=external)")
|
|
71
|
+
label: str | None = Field(default=None, description="Human-readable label")
|
|
72
|
+
ordinal: int | None = Field(default=None, description="Sort ordinal")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class ArticleTagSummary(DevRevResponseModel):
|
|
76
|
+
"""Tag summary as returned within an article's ``tags`` array."""
|
|
77
|
+
|
|
78
|
+
id: str = Field(..., description="Tag DON ID")
|
|
79
|
+
name: str | None = Field(default=None, description="Tag name")
|
|
80
|
+
display_id: str | None = Field(default=None, description="Tag display ID")
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class ArticleTagWithValue(DevRevResponseModel):
|
|
84
|
+
"""Tag entry on an article, wrapping the tag summary with an optional value."""
|
|
85
|
+
|
|
86
|
+
tag: ArticleTagSummary = Field(..., description="Tag details")
|
|
87
|
+
value: str | None = Field(default=None, description="Optional tag value")
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class ArticleParentSummary(DevRevResponseModel):
|
|
91
|
+
"""Summary of a parent directory (collection) for an article."""
|
|
92
|
+
|
|
93
|
+
id: str = Field(..., description="Directory DON ID")
|
|
94
|
+
display_id: str | None = Field(default=None, description="Display ID")
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class Article(DevRevResponseModel):
|
|
98
|
+
"""DevRev Article model.
|
|
99
|
+
|
|
100
|
+
Note: The API returns authored_by as an array of UserSummary objects,
|
|
101
|
+
not a single UserSummary object as documented in the OpenAPI spec.
|
|
102
|
+
"""
|
|
103
|
+
|
|
104
|
+
id: str = Field(..., description="Article ID")
|
|
105
|
+
display_id: str | None = Field(default=None, description="Display ID")
|
|
106
|
+
title: str = Field(..., description="Article title")
|
|
107
|
+
description: str | None = Field(default=None, description="Article description/body")
|
|
108
|
+
status: ArticleStatus | None = Field(default=None, description="Article status")
|
|
109
|
+
article_type: str | None = Field(default=None, description="Article type (article, page, etc.)")
|
|
110
|
+
authored_by: list[UserSummary] | None = Field(
|
|
111
|
+
default=None, description="Authors of the article (API returns array, not single object)"
|
|
112
|
+
)
|
|
113
|
+
owned_by: list[UserSummary] | None = Field(default=None, description="Owners of the article")
|
|
114
|
+
created_date: datetime | None = Field(default=None, description="Creation date")
|
|
115
|
+
modified_date: datetime | None = Field(default=None, description="Last modified")
|
|
116
|
+
resource: dict[str, Any] | None = Field(
|
|
117
|
+
default=None, description="Resource configuration including artifact references"
|
|
118
|
+
)
|
|
119
|
+
applies_to_parts: list[dict[str, Any]] | None = Field(
|
|
120
|
+
default=None, description="Parts this article applies to"
|
|
121
|
+
)
|
|
122
|
+
scope: ArticleScope | None = Field(
|
|
123
|
+
default=None, description="Visibility scope (internal/external)"
|
|
124
|
+
)
|
|
125
|
+
tags: list[ArticleTagWithValue] | None = Field(
|
|
126
|
+
default=None, description="Tags applied to the article"
|
|
127
|
+
)
|
|
128
|
+
parent: ArticleParentSummary | None = Field(
|
|
129
|
+
default=None, description="Parent directory/collection"
|
|
130
|
+
)
|
|
131
|
+
language: str | None = Field(default=None, description="Language code (e.g., 'en')")
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
class ArticleSummary(DevRevResponseModel):
|
|
135
|
+
"""Summary of an Article."""
|
|
136
|
+
|
|
137
|
+
id: str = Field(..., description="Article ID")
|
|
138
|
+
title: str | None = Field(default=None, description="Article title")
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
class ArticleWithContent(DevRevResponseModel):
|
|
142
|
+
"""Article with its content loaded.
|
|
143
|
+
|
|
144
|
+
This model combines article metadata with the actual article body content,
|
|
145
|
+
which is stored separately as an artifact in the DevRev system.
|
|
146
|
+
"""
|
|
147
|
+
|
|
148
|
+
article: Article = Field(..., description="Article metadata")
|
|
149
|
+
content: str = Field(..., description="Article body content")
|
|
150
|
+
content_format: str = Field(default="text/plain", description="Content MIME type")
|
|
151
|
+
content_version: str | None = Field(default=None, description="Artifact version")
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
class SetSharedWithMembership(DevRevBaseModel):
|
|
155
|
+
"""Shared-with membership for articles."""
|
|
156
|
+
|
|
157
|
+
member: str = Field(..., description="Member ID")
|
|
158
|
+
role: str | None = Field(default=None, description="Role")
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class ArticlesCreateRequest(DevRevBaseModel):
|
|
162
|
+
"""Request to create an article.
|
|
163
|
+
|
|
164
|
+
Supports associating the article with parts, a parent collection (directory),
|
|
165
|
+
scope (internal/external), and tags at creation time.
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
title: str = Field(..., description="Article title")
|
|
169
|
+
description: str | None = Field(default=None, description="Article description/body")
|
|
170
|
+
status: ArticleStatus | None = Field(default=None, description="Article status")
|
|
171
|
+
owned_by: list[str] = Field(..., description="List of dev user IDs who own the article")
|
|
172
|
+
resource: dict[str, Any] = Field(
|
|
173
|
+
default_factory=dict, description="Resource configuration for the article"
|
|
174
|
+
)
|
|
175
|
+
applies_to_parts: list[str] | None = Field(
|
|
176
|
+
default=None, description="List of part IDs this article applies to"
|
|
177
|
+
)
|
|
178
|
+
scope: int | None = Field(default=None, description="Visibility scope: 1=internal, 2=external")
|
|
179
|
+
tags: list[SetTagWithValue] | None = Field(
|
|
180
|
+
default=None, description="Tags to apply (list of {'id': 'tag_id', 'value': ...})"
|
|
181
|
+
)
|
|
182
|
+
parent: str | None = Field(default=None, description="Parent directory/collection DON ID")
|
|
183
|
+
article_type: str | None = Field(
|
|
184
|
+
default=None, description="Article type: 'article' (default), 'page', 'content_block'"
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
class ArticlesGetRequest(DevRevBaseModel):
|
|
189
|
+
"""Request to get an article by ID."""
|
|
190
|
+
|
|
191
|
+
id: str = Field(..., description="Article ID")
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
class ArticlesDeleteRequest(DevRevBaseModel):
|
|
195
|
+
"""Request to delete an article."""
|
|
196
|
+
|
|
197
|
+
id: str = Field(..., description="Article ID to delete")
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
class ArticlesListRequestSharedWith(DevRevBaseModel):
|
|
201
|
+
"""Shared-with filter for listing articles."""
|
|
202
|
+
|
|
203
|
+
member: str | None = Field(default=None, description="Member ID filter")
|
|
204
|
+
role: str | None = Field(default=None, description="Role filter")
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
class ArticlesListRequest(DevRevBaseModel):
|
|
208
|
+
"""Request to list articles."""
|
|
209
|
+
|
|
210
|
+
cursor: str | None = Field(default=None, description="Pagination cursor")
|
|
211
|
+
limit: int | None = Field(default=None, ge=1, le=100, description="Max results")
|
|
212
|
+
applies_to_parts: list[str] | None = Field(default=None, description="Filter by part IDs")
|
|
213
|
+
article_type: list[ArticleType] | None = Field(
|
|
214
|
+
default=None, description="Filter by article types"
|
|
215
|
+
)
|
|
216
|
+
authored_by: list[str] | None = Field(default=None, description="Filter by author user IDs")
|
|
217
|
+
brands: list[str] | None = Field(default=None, description="Filter by brand IDs")
|
|
218
|
+
created_by: list[str] | None = Field(default=None, description="Filter by creator user IDs")
|
|
219
|
+
mode: CursorMode | None = Field(default=None, description="Cursor pagination direction")
|
|
220
|
+
modified_by: list[str] | None = Field(default=None, description="Filter by modifier user IDs")
|
|
221
|
+
owned_by: list[str] | None = Field(default=None, description="Filter by owner user IDs")
|
|
222
|
+
parent: list[str] | None = Field(default=None, description="Filter by parent article IDs")
|
|
223
|
+
scope: list[int] | None = Field(default=None, description="Filter by scope values")
|
|
224
|
+
shared_with: ArticlesListRequestSharedWith | None = Field(
|
|
225
|
+
default=None, description="Filter by shared-with membership"
|
|
226
|
+
)
|
|
227
|
+
status: list[ArticleStatus] | None = Field(default=None, description="Filter by article status")
|
|
228
|
+
tags: list[str] | None = Field(default=None, description="Filter by tag IDs")
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
class ArticlesUpdateRequestOwnedBy(DevRevBaseModel):
|
|
232
|
+
"""Owned-by update for articles."""
|
|
233
|
+
|
|
234
|
+
set: list[str] | None = Field(default=None, description="Set owner IDs")
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
class ArticlesUpdateRequestAuthoredBy(DevRevBaseModel):
|
|
238
|
+
"""Authored-by update for articles."""
|
|
239
|
+
|
|
240
|
+
set: list[str] | None = Field(default=None, description="Set author IDs")
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
class ArticlesUpdateRequestAliases(DevRevBaseModel):
|
|
244
|
+
"""Aliases update for articles."""
|
|
245
|
+
|
|
246
|
+
set: list[str] | None = Field(default=None, description="Set aliases")
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
class ArticlesUpdateRequestAppliesToParts(DevRevBaseModel):
|
|
250
|
+
"""Applies-to-parts update for articles."""
|
|
251
|
+
|
|
252
|
+
set: list[str] | None = Field(default=None, description="Set part IDs")
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
class ArticlesUpdateRequestTags(DevRevBaseModel):
|
|
256
|
+
"""Tags update for articles."""
|
|
257
|
+
|
|
258
|
+
set: list[SetTagWithValue] | None = Field(default=None, description="Set tags")
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
class ArticlesUpdateRequest(DevRevBaseModel):
|
|
262
|
+
"""Request to update an article."""
|
|
263
|
+
|
|
264
|
+
id: str = Field(..., description="Article ID")
|
|
265
|
+
title: str | None = Field(default=None, description="New title")
|
|
266
|
+
description: str | None = Field(default=None, description="New description/body")
|
|
267
|
+
status: ArticleStatus | None = Field(default=None, description="New status")
|
|
268
|
+
access_level: ArticleAccessLevel | None = Field(default=None, description="New access level")
|
|
269
|
+
aliases: ArticlesUpdateRequestAliases | None = Field(default=None, description="New aliases")
|
|
270
|
+
applies_to_parts: ArticlesUpdateRequestAppliesToParts | None = Field(
|
|
271
|
+
default=None, description="New applies-to-parts"
|
|
272
|
+
)
|
|
273
|
+
authored_by: ArticlesUpdateRequestAuthoredBy | None = Field(
|
|
274
|
+
default=None, description="New authored-by"
|
|
275
|
+
)
|
|
276
|
+
brand: str | None = Field(default=None, description="New brand ID")
|
|
277
|
+
content_format: ArticleContentFormat | None = Field(
|
|
278
|
+
default=None, description="New content format"
|
|
279
|
+
)
|
|
280
|
+
custom_fields: dict[str, Any] | None = Field(default=None, description="Custom fields")
|
|
281
|
+
custom_schema_spec: CustomSchemaSpec | None = Field(
|
|
282
|
+
default=None, description="Custom schema spec"
|
|
283
|
+
)
|
|
284
|
+
language: str | None = Field(default=None, description="New language code")
|
|
285
|
+
notify: bool | None = Field(default=None, description="Send notifications")
|
|
286
|
+
owned_by: ArticlesUpdateRequestOwnedBy | None = Field(default=None, description="New owned-by")
|
|
287
|
+
parent: str | None = Field(default=None, description="New parent article ID")
|
|
288
|
+
published_version: str | None = Field(default=None, description="Published version")
|
|
289
|
+
release_notes: str | None = Field(default=None, description="New release notes")
|
|
290
|
+
artifacts: dict[str, Any] | None = Field(
|
|
291
|
+
default=None,
|
|
292
|
+
description="Artifacts update using set wrapper, e.g. {'set': ['artifact_id']}",
|
|
293
|
+
)
|
|
294
|
+
resource: dict[str, Any] | None = Field(
|
|
295
|
+
default=None,
|
|
296
|
+
description="Resource configuration (read-only on updates, use artifacts instead)",
|
|
297
|
+
)
|
|
298
|
+
tags: ArticlesUpdateRequestTags | None = Field(default=None, description="New tags")
|
|
299
|
+
url: str | None = Field(default=None, description="Article URL")
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
class ArticlesCreateResponse(DevRevResponseModel):
|
|
303
|
+
"""Response from creating an article."""
|
|
304
|
+
|
|
305
|
+
article: Article = Field(..., description="Created article")
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
class ArticlesGetResponse(DevRevResponseModel):
|
|
309
|
+
"""Response from getting an article."""
|
|
310
|
+
|
|
311
|
+
article: Article = Field(..., description="Retrieved article")
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
class ArticlesListResponse(PaginatedResponse):
|
|
315
|
+
"""Response from listing articles."""
|
|
316
|
+
|
|
317
|
+
articles: list[Article] = Field(..., description="List of articles")
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
class ArticlesUpdateResponse(DevRevResponseModel):
|
|
321
|
+
"""Response from updating an article."""
|
|
322
|
+
|
|
323
|
+
article: Article = Field(..., description="Updated article")
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
class ArticlesDeleteResponse(DevRevResponseModel):
|
|
327
|
+
"""Response from deleting an article."""
|
|
328
|
+
|
|
329
|
+
pass
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
class ArticlesCountRequest(DevRevBaseModel):
|
|
333
|
+
"""Request to count articles (beta only)."""
|
|
334
|
+
|
|
335
|
+
status: list[str] | None = Field(default=None, description="Filter by article status")
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
class ArticlesCountResponse(DevRevResponseModel):
|
|
339
|
+
"""Response from counting articles (beta only)."""
|
|
340
|
+
|
|
341
|
+
count: int = Field(..., description="Count of matching articles")
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
from datetime import datetime
|
|
6
|
+
from typing import Any
|
|
6
7
|
|
|
7
8
|
from pydantic import Field
|
|
8
9
|
|
|
@@ -13,7 +14,10 @@ class Artifact(DevRevResponseModel):
|
|
|
13
14
|
"""DevRev Artifact model."""
|
|
14
15
|
|
|
15
16
|
id: str = Field(..., description="Artifact ID")
|
|
16
|
-
created_by: str | None = Field(
|
|
17
|
+
created_by: dict[str, Any] | str | None = Field(
|
|
18
|
+
default=None,
|
|
19
|
+
description="Creator - may be a user ID string or a user object dict",
|
|
20
|
+
)
|
|
17
21
|
created_date: datetime | None = Field(default=None, description="Creation timestamp")
|
|
18
22
|
file_name: str | None = Field(default=None, description="Original file name")
|
|
19
23
|
file_type: str | None = Field(default=None, description="MIME type of the file")
|
|
@@ -72,9 +76,7 @@ class ArtifactGetResponse(DevRevResponseModel):
|
|
|
72
76
|
class ArtifactListRequest(DevRevBaseModel):
|
|
73
77
|
"""Request to list artifacts."""
|
|
74
78
|
|
|
75
|
-
parent_id: str | None = Field(
|
|
76
|
-
default=None, description="Filter artifacts by parent object ID"
|
|
77
|
-
)
|
|
79
|
+
parent_id: str | None = Field(default=None, description="Filter artifacts by parent object ID")
|
|
78
80
|
|
|
79
81
|
|
|
80
82
|
class ArtifactListResponse(PaginatedResponse):
|