devrev-Python-SDK 2.8.1__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.1 → devrev_python_sdk-2.9.0}/PKG-INFO +8 -1
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/README.md +7 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/articles.md +7 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/changelog.md +6 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/mcp/tools-reference.md +1 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/pyproject.toml +1 -1
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/articles.py +37 -2
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/articles.py +9 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/conftest.py +2 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_articles.py +50 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_articles_unified.py +163 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/bug-fixer.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/builder.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/documentation.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/foreman.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/pr-review-boss.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/release-manager.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/simplifier.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/tester.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/commands/foreman-work.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/commands/release-prepare.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/commands/review-start.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/commands/simplify-code.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/code-quality.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/data-modeling.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/devrev-sdk.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/git-workflow.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/pull-requests.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/python-development.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/security.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/testing.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.dockerignore +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.env.sample +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/article-artifact-simplification.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/dependabot.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/pull_request_template.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/api-check.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/ci.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/claude-code-review.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/claude.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/deploy.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/docs.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/integration-tests.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/release.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/sync-openapi.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.gitignore +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.pre-commit-config.yaml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/CLAUDE.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/CODE_OF_CONDUCT.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/CONTRIBUTING.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/DEPRECATIONS.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/Dockerfile +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/KNOWN_ISSUES.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/OPENAPI_SPEC_DISCREPANCIES.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/SECURITY.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/augment-mcp-config-remote.json +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/augment-mcp-config.json +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/augment-settings.json +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/benchmarks/README.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/benchmarks/bench_http_client.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/benchmarks/bench_models.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/benchmarks/bench_pagination.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/benchmarks/conftest.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/context7.json +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/README.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/audit-logging-setup.sh +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/cloudbuild.yaml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/monitoring/README.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/monitoring/alert-policies.yaml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/monitoring/dashboard.json +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/monitoring/validate-config.sh +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/service.yaml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docker-compose.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/brands.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/engagements.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/incidents.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/index.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/question-answers.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/recommendations.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/search.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/uoms.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta-api-differences.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/client.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/config.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/exceptions.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/index.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/models/accounts.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/models/base.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/models/index.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/models/users.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/models/works.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/accounts.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/code-changes.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/conversations.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/dev-users.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/groups.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/index.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/links.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/parts.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/rev-users.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/slas.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/tags.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/timeline-entries.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/webhooks.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/works.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/examples/advanced.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/examples/basic.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/examples/beta-features.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/examples/index.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/examples/integrations.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/getting-started/authentication.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/getting-started/index.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/getting-started/installation.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/getting-started/quickstart.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/beta-api.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/compatibility.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/configuration.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/error-handling.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/github-actions-setup.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/index.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/logging.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/pagination.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/sync-vs-async.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/testing.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/version-support.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/write-integration-testing-strategy.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/hooks/copy_llms.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/index.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/mcp/deployment.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/mcp/index.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/mcp/quickstart.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/stylesheets/extra.css +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/README.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/basic/README.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/basic/async_example.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/basic/create_work.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/basic/error_handling.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/basic/list_accounts.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/basic/pagination.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/basic/search_users.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/cloud_functions/README.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/cloud_functions/main.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/cloud_functions/requirements.txt +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/fastapi/README.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/fastapi/main.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/fastapi/requirements.txt +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/flask/README.md +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/flask/app.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/flask/requirements.txt +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/llms-ctx-full.txt +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/llms-ctx.txt +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/llms-mcp.txt +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/llms.txt +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/mkdocs.yml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/openapi-beta.yaml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/openapi-public.yaml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/openapi-spec-corrections.yaml +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/scripts/build_ai_docs.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/scripts/setup-github-secrets.sh +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/client.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/config.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/exceptions.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/accounts.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/articles.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/artifacts.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/base.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/brands.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/code_changes.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/conversations.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/dev_users.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/engagements.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/groups.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/incidents.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/links.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/notifications.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/parts.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/preferences.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/question_answers.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/recommendations.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/rev_users.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/search.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/slas.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/sync.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/tags.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/tasks.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/timeline_entries.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/timeline_events.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/track_events.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/uoms.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/webhooks.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/widgets.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/works.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/py.typed +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/accounts.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/artifacts.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/base.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/brands.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/code_changes.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/conversations.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/dev_users.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/engagements.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/groups.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/incidents.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/links.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/notifications.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/parts.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/preferences.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/question_answers.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/recommendations.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/rev_users.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/search.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/slas.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/tags.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/timeline_entries.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/track_events.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/uoms.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/webhooks.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/works.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/utils/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/utils/content_converter.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/utils/deprecation.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/utils/http.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/utils/logging.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/utils/pagination.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/__main__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/config.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/middleware/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/middleware/audit.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/middleware/auth.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/middleware/health.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/middleware/rate_limit.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/escalation.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/investigate.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/response.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/summarize.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/triage.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/account.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/article.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/conversation.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/part.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/server_info.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/ticket.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/user.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/server.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/accounts.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/conversations.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/engagements.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/groups.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/incidents.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/links.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/parts.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/recommendations.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/search.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/server_info.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/slas.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/tags.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/timeline.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/users.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/works.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/utils/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/utils/errors.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/utils/formatting.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/utils/pagination.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/conftest.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/conftest.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_accounts_e2e.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_all_readonly_endpoints.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_articles_lifecycle.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_backwards_compatibility.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_contacts_e2e.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_core_services_phase1.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_extended_services_phase2.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_get_endpoints.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_issues_e2e.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_kb_articles_e2e.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_mcp_articles.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_ping.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_question_answers_e2e.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_readonly_endpoints.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_specialized_services_phase3.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_tickets_e2e.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_write_operations.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/utils/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/utils/cleanup.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/utils/constants.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/utils/data_manager.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/performance/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/performance/test_articles_performance.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_audit.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_config.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_phase4_transport.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_prompts.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_resources.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_server_info.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_accounts.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_conversations.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_engagements.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_groups.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_incidents.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_links.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_parts.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_recommendations.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_search.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_slas.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_tags.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_timeline.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_users.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_works.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_utils.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/models/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/models/test_user_state_regression.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/__init__.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/conftest.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_articles.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_async_services.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_brands.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_code_changes.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_conversations.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_engagements.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_groups.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_incidents.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_links.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_notifications.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_parts.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_preferences.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_question_answers.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_recommendations.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_search.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_slas.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_tags.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_timeline_entries.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_track_events.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_uoms.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_webhooks.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_works.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_artifacts.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_backward_compatibility.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_base_service.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_client.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_config.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_content_converter.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_deprecation.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_error_handling.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_exceptions.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_http.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_logging.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_pagination.py +0 -0
- {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/uv.lock +0 -0
|
@@ -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
|
|
@@ -517,6 +517,7 @@ article = client.articles.create_with_content(
|
|
|
517
517
|
owned_by=["don:identity:dvrv-us-1:devo/1:devu/1"],
|
|
518
518
|
description="Quick start guide for new users", # Optional metadata
|
|
519
519
|
status=ArticleStatus.PUBLISHED,
|
|
520
|
+
applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123"], # Optional: associate with parts
|
|
520
521
|
)
|
|
521
522
|
|
|
522
523
|
# Get article with content
|
|
@@ -538,6 +539,12 @@ client.articles.update_with_content(
|
|
|
538
539
|
status=ArticleStatus.ARCHIVED,
|
|
539
540
|
)
|
|
540
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
|
+
|
|
541
548
|
# List published articles (metadata only)
|
|
542
549
|
published = client.articles.list(limit=20)
|
|
543
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:
|
|
@@ -93,6 +93,7 @@ article = client.articles.create_with_content(
|
|
|
93
93
|
description="Short summary for search/listing", # Optional metadata
|
|
94
94
|
status=ArticleStatus.PUBLISHED, # Optional: draft, published, archived
|
|
95
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
|
|
96
97
|
)
|
|
97
98
|
print(f"Created article with content: {article.id}")
|
|
98
99
|
```
|
|
@@ -181,6 +182,12 @@ updated_article = client.articles.update_with_content(
|
|
|
181
182
|
id="don:core:dvrv-us-1:devo/1:article/123",
|
|
182
183
|
content="<h1>New Content</h1>",
|
|
183
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
|
+
)
|
|
184
191
|
```
|
|
185
192
|
|
|
186
193
|
### Async Usage
|
|
@@ -7,6 +7,12 @@ 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
|
+
|
|
10
16
|
## [2.8.1] - 2026-03-06
|
|
11
17
|
|
|
12
18
|
### Fixed
|
|
@@ -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
|
|
|
@@ -21,6 +21,7 @@ from devrev.models.articles import (
|
|
|
21
21
|
ArticlesListResponse,
|
|
22
22
|
ArticleStatus,
|
|
23
23
|
ArticlesUpdateRequest,
|
|
24
|
+
ArticlesUpdateRequestAppliesToParts,
|
|
24
25
|
ArticlesUpdateResponse,
|
|
25
26
|
ArticleType,
|
|
26
27
|
ArticleWithContent,
|
|
@@ -437,6 +438,7 @@ class ArticlesService(BaseService):
|
|
|
437
438
|
content: str | None = None,
|
|
438
439
|
description: str | None = None,
|
|
439
440
|
status: ArticleStatus | None = None,
|
|
441
|
+
applies_to_parts: builtins.list[str] | None = None,
|
|
440
442
|
) -> Article:
|
|
441
443
|
"""Update article metadata and/or content.
|
|
442
444
|
|
|
@@ -451,6 +453,7 @@ class ArticlesService(BaseService):
|
|
|
451
453
|
content: Optional new article body content
|
|
452
454
|
description: Optional new metadata description
|
|
453
455
|
status: Optional new status
|
|
456
|
+
applies_to_parts: Optional list of part IDs to associate with
|
|
454
457
|
|
|
455
458
|
Returns:
|
|
456
459
|
Updated article
|
|
@@ -478,6 +481,12 @@ class ArticlesService(BaseService):
|
|
|
478
481
|
... title="New Title",
|
|
479
482
|
... content="<html>New content...</html>"
|
|
480
483
|
... )
|
|
484
|
+
>>>
|
|
485
|
+
>>> # Update applies_to_parts
|
|
486
|
+
>>> article = client.articles.update_with_content(
|
|
487
|
+
... "ART-123",
|
|
488
|
+
... applies_to_parts=["don:core:...:capability/6"]
|
|
489
|
+
... )
|
|
481
490
|
"""
|
|
482
491
|
if not self._parent_client:
|
|
483
492
|
raise DevRevError(
|
|
@@ -489,13 +498,25 @@ class ArticlesService(BaseService):
|
|
|
489
498
|
if content is not None:
|
|
490
499
|
self.update_content(id, content)
|
|
491
500
|
|
|
501
|
+
# Build applies_to_parts wrapper if provided
|
|
502
|
+
applies_to_parts_req = None
|
|
503
|
+
if applies_to_parts is not None:
|
|
504
|
+
applies_to_parts_req = ArticlesUpdateRequestAppliesToParts(set=applies_to_parts)
|
|
505
|
+
|
|
492
506
|
# Update metadata if any metadata fields provided
|
|
493
|
-
|
|
507
|
+
has_metadata = (
|
|
508
|
+
title is not None
|
|
509
|
+
or description is not None
|
|
510
|
+
or status is not None
|
|
511
|
+
or applies_to_parts is not None
|
|
512
|
+
)
|
|
513
|
+
if has_metadata:
|
|
494
514
|
update_req = ArticlesUpdateRequest(
|
|
495
515
|
id=id,
|
|
496
516
|
title=title,
|
|
497
517
|
description=description,
|
|
498
518
|
status=status,
|
|
519
|
+
applies_to_parts=applies_to_parts_req,
|
|
499
520
|
)
|
|
500
521
|
return self.update(update_req)
|
|
501
522
|
|
|
@@ -822,6 +843,7 @@ class AsyncArticlesService(AsyncBaseService):
|
|
|
822
843
|
content: str | None = None,
|
|
823
844
|
description: str | None = None,
|
|
824
845
|
status: ArticleStatus | None = None,
|
|
846
|
+
applies_to_parts: builtins.list[str] | None = None,
|
|
825
847
|
) -> Article:
|
|
826
848
|
"""Update article metadata and/or content (async).
|
|
827
849
|
|
|
@@ -836,6 +858,7 @@ class AsyncArticlesService(AsyncBaseService):
|
|
|
836
858
|
content: Optional new article body content
|
|
837
859
|
description: Optional new metadata description
|
|
838
860
|
status: Optional new status
|
|
861
|
+
applies_to_parts: Optional list of part IDs to associate with
|
|
839
862
|
|
|
840
863
|
Returns:
|
|
841
864
|
Updated article
|
|
@@ -853,13 +876,25 @@ class AsyncArticlesService(AsyncBaseService):
|
|
|
853
876
|
if content is not None:
|
|
854
877
|
await self.update_content(id, content)
|
|
855
878
|
|
|
879
|
+
# Build applies_to_parts wrapper if provided
|
|
880
|
+
applies_to_parts_req = None
|
|
881
|
+
if applies_to_parts is not None:
|
|
882
|
+
applies_to_parts_req = ArticlesUpdateRequestAppliesToParts(set=applies_to_parts)
|
|
883
|
+
|
|
856
884
|
# Update metadata if any metadata fields provided
|
|
857
|
-
|
|
885
|
+
has_metadata = (
|
|
886
|
+
title is not None
|
|
887
|
+
or description is not None
|
|
888
|
+
or status is not None
|
|
889
|
+
or applies_to_parts is not None
|
|
890
|
+
)
|
|
891
|
+
if has_metadata:
|
|
858
892
|
update_req = ArticlesUpdateRequest(
|
|
859
893
|
id=id,
|
|
860
894
|
title=title,
|
|
861
895
|
description=description,
|
|
862
896
|
status=status,
|
|
897
|
+
applies_to_parts=applies_to_parts_req,
|
|
863
898
|
)
|
|
864
899
|
return await self.update(update_req)
|
|
865
900
|
|
|
@@ -102,6 +102,7 @@ if _config.enable_destructive_tools:
|
|
|
102
102
|
description: str | None = None,
|
|
103
103
|
status: str | None = None,
|
|
104
104
|
content_format: str = "text/html",
|
|
105
|
+
applies_to_parts: list[str] | None = None,
|
|
105
106
|
) -> dict[str, Any]:
|
|
106
107
|
"""Create a new article with content.
|
|
107
108
|
|
|
@@ -113,6 +114,8 @@ if _config.enable_destructive_tools:
|
|
|
113
114
|
description: Optional short metadata description (NOT the article body).
|
|
114
115
|
status: Optional article status (draft, published, archived).
|
|
115
116
|
content_format: Content MIME type (default: text/html).
|
|
117
|
+
applies_to_parts: Optional list of part IDs (products, capabilities,
|
|
118
|
+
features, enhancements) to associate the article with.
|
|
116
119
|
|
|
117
120
|
Returns:
|
|
118
121
|
Dictionary containing the created article details.
|
|
@@ -139,6 +142,7 @@ if _config.enable_destructive_tools:
|
|
|
139
142
|
description=description,
|
|
140
143
|
status=article_status,
|
|
141
144
|
content_format=content_format,
|
|
145
|
+
applies_to_parts=applies_to_parts,
|
|
142
146
|
)
|
|
143
147
|
return serialize_model(article)
|
|
144
148
|
except DevRevError as e:
|
|
@@ -152,6 +156,7 @@ if _config.enable_destructive_tools:
|
|
|
152
156
|
content: str | None = None,
|
|
153
157
|
description: str | None = None,
|
|
154
158
|
status: str | None = None,
|
|
159
|
+
applies_to_parts: list[str] | None = None,
|
|
155
160
|
) -> dict[str, Any]:
|
|
156
161
|
"""Update an existing article in DevRev.
|
|
157
162
|
|
|
@@ -162,6 +167,9 @@ if _config.enable_destructive_tools:
|
|
|
162
167
|
content: Optional new article body content.
|
|
163
168
|
description: Optional new metadata description (NOT the article body).
|
|
164
169
|
status: Optional new status (draft, published, archived).
|
|
170
|
+
applies_to_parts: Optional list of part IDs (products, capabilities,
|
|
171
|
+
features, enhancements) to associate the article with.
|
|
172
|
+
Pass an empty list to remove all associations.
|
|
165
173
|
|
|
166
174
|
Returns:
|
|
167
175
|
Dictionary containing the updated article details.
|
|
@@ -187,6 +195,7 @@ if _config.enable_destructive_tools:
|
|
|
187
195
|
content=content,
|
|
188
196
|
description=description,
|
|
189
197
|
status=article_status,
|
|
198
|
+
applies_to_parts=applies_to_parts,
|
|
190
199
|
)
|
|
191
200
|
return serialize_model(article)
|
|
192
201
|
except DevRevError as e:
|
|
@@ -110,7 +110,9 @@ def mock_client():
|
|
|
110
110
|
client.articles.list = AsyncMock()
|
|
111
111
|
client.articles.get = AsyncMock()
|
|
112
112
|
client.articles.create = AsyncMock()
|
|
113
|
+
client.articles.create_with_content = AsyncMock()
|
|
113
114
|
client.articles.update = AsyncMock()
|
|
115
|
+
client.articles.update_with_content = AsyncMock()
|
|
114
116
|
client.articles.delete = AsyncMock()
|
|
115
117
|
client.articles.count = AsyncMock()
|
|
116
118
|
|
|
@@ -154,6 +154,34 @@ class TestArticlesCreateTool:
|
|
|
154
154
|
owned_by=["don:identity:dvrv-us-1:devo/test:devu/1"],
|
|
155
155
|
)
|
|
156
156
|
|
|
157
|
+
@pytest.mark.asyncio
|
|
158
|
+
async def test_create_with_applies_to_parts(self, mock_ctx, mock_client):
|
|
159
|
+
"""Test creating an article with applies_to_parts."""
|
|
160
|
+
mock_article = _make_mock_article(
|
|
161
|
+
title="Article with Parts",
|
|
162
|
+
description="Content with parts",
|
|
163
|
+
)
|
|
164
|
+
mock_client.articles.create_with_content.return_value = mock_article
|
|
165
|
+
|
|
166
|
+
result = await devrev_articles_create(
|
|
167
|
+
mock_ctx,
|
|
168
|
+
title="Article with Parts",
|
|
169
|
+
content="Content with parts",
|
|
170
|
+
owned_by=["don:identity:dvrv-us-1:devo/test:devu/1"],
|
|
171
|
+
applies_to_parts=[
|
|
172
|
+
"don:core:dvrv-us-1:devo/1:product/1",
|
|
173
|
+
"don:core:dvrv-us-1:devo/1:capability/2",
|
|
174
|
+
],
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
assert result["title"] == "Article with Parts"
|
|
178
|
+
# Verify applies_to_parts was passed to SDK
|
|
179
|
+
call_args = mock_client.articles.create_with_content.call_args
|
|
180
|
+
assert call_args[1]["applies_to_parts"] == [
|
|
181
|
+
"don:core:dvrv-us-1:devo/1:product/1",
|
|
182
|
+
"don:core:dvrv-us-1:devo/1:capability/2",
|
|
183
|
+
]
|
|
184
|
+
|
|
157
185
|
|
|
158
186
|
class TestArticlesUpdateTool:
|
|
159
187
|
"""Tests for devrev_articles_update tool."""
|
|
@@ -186,6 +214,28 @@ class TestArticlesUpdateTool:
|
|
|
186
214
|
with pytest.raises(RuntimeError, match="Article not found"):
|
|
187
215
|
await devrev_articles_update(mock_ctx, id="nonexistent", title="New")
|
|
188
216
|
|
|
217
|
+
@pytest.mark.asyncio
|
|
218
|
+
async def test_update_with_applies_to_parts(self, mock_ctx, mock_client):
|
|
219
|
+
"""Test updating an article with applies_to_parts."""
|
|
220
|
+
mock_article = _make_mock_article(
|
|
221
|
+
id="article-1",
|
|
222
|
+
title="Updated Article",
|
|
223
|
+
status="published",
|
|
224
|
+
)
|
|
225
|
+
mock_client.articles.update_with_content.return_value = mock_article
|
|
226
|
+
|
|
227
|
+
result = await devrev_articles_update(
|
|
228
|
+
mock_ctx,
|
|
229
|
+
id="article-1",
|
|
230
|
+
title="Updated Article",
|
|
231
|
+
applies_to_parts=["don:core:dvrv-us-1:devo/1:feature/3"],
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
assert result["title"] == "Updated Article"
|
|
235
|
+
# Verify applies_to_parts was passed to SDK
|
|
236
|
+
call_args = mock_client.articles.update_with_content.call_args
|
|
237
|
+
assert call_args[1]["applies_to_parts"] == ["don:core:dvrv-us-1:devo/1:feature/3"]
|
|
238
|
+
|
|
189
239
|
|
|
190
240
|
class TestArticlesDeleteTool:
|
|
191
241
|
"""Tests for devrev_articles_delete tool."""
|
|
@@ -776,6 +776,86 @@ class TestUpdateWithContent:
|
|
|
776
776
|
with pytest.raises(DevRevError, match="update_with_content requires parent client"):
|
|
777
777
|
articles_service_no_parent.update_with_content("article-123", title="New")
|
|
778
778
|
|
|
779
|
+
def test_update_with_content_applies_to_parts_only(
|
|
780
|
+
self,
|
|
781
|
+
articles_service: ArticlesService,
|
|
782
|
+
mock_article: Article,
|
|
783
|
+
mock_http_client: MagicMock,
|
|
784
|
+
) -> None:
|
|
785
|
+
"""Test updating only applies_to_parts."""
|
|
786
|
+
mock_response = MagicMock()
|
|
787
|
+
mock_response.json.return_value = {"article": mock_article.model_dump(mode="json")}
|
|
788
|
+
mock_http_client.post.return_value = mock_response
|
|
789
|
+
|
|
790
|
+
result = articles_service.update_with_content(
|
|
791
|
+
"article-123",
|
|
792
|
+
applies_to_parts=["don:core:dvrv-us-1:devo/1:product/1"],
|
|
793
|
+
)
|
|
794
|
+
|
|
795
|
+
assert result.id == "article-123"
|
|
796
|
+
# Verify update was called with applies_to_parts wrapped in set
|
|
797
|
+
post_call = mock_http_client.post.call_args
|
|
798
|
+
assert "articles.update" in post_call[0][0]
|
|
799
|
+
data = post_call[1]["data"]
|
|
800
|
+
assert "applies_to_parts" in data
|
|
801
|
+
assert data["applies_to_parts"]["set"] == ["don:core:dvrv-us-1:devo/1:product/1"]
|
|
802
|
+
|
|
803
|
+
def test_update_with_content_applies_to_parts_with_metadata(
|
|
804
|
+
self,
|
|
805
|
+
articles_service: ArticlesService,
|
|
806
|
+
mock_article: Article,
|
|
807
|
+
mock_http_client: MagicMock,
|
|
808
|
+
) -> None:
|
|
809
|
+
"""Test updating applies_to_parts along with other metadata."""
|
|
810
|
+
mock_response = MagicMock()
|
|
811
|
+
mock_response.json.return_value = {"article": mock_article.model_dump(mode="json")}
|
|
812
|
+
mock_http_client.post.return_value = mock_response
|
|
813
|
+
|
|
814
|
+
result = articles_service.update_with_content(
|
|
815
|
+
"article-123",
|
|
816
|
+
title="New Title",
|
|
817
|
+
description="New description",
|
|
818
|
+
applies_to_parts=[
|
|
819
|
+
"don:core:dvrv-us-1:devo/1:capability/2",
|
|
820
|
+
"don:core:dvrv-us-1:devo/1:feature/3",
|
|
821
|
+
],
|
|
822
|
+
)
|
|
823
|
+
|
|
824
|
+
assert result.id == "article-123"
|
|
825
|
+
# Verify all metadata was passed including applies_to_parts
|
|
826
|
+
post_call = mock_http_client.post.call_args
|
|
827
|
+
data = post_call[1]["data"]
|
|
828
|
+
assert data["title"] == "New Title"
|
|
829
|
+
assert data["description"] == "New description"
|
|
830
|
+
assert "applies_to_parts" in data
|
|
831
|
+
assert data["applies_to_parts"]["set"] == [
|
|
832
|
+
"don:core:dvrv-us-1:devo/1:capability/2",
|
|
833
|
+
"don:core:dvrv-us-1:devo/1:feature/3",
|
|
834
|
+
]
|
|
835
|
+
|
|
836
|
+
def test_update_with_content_applies_to_parts_empty_list(
|
|
837
|
+
self,
|
|
838
|
+
articles_service: ArticlesService,
|
|
839
|
+
mock_article: Article,
|
|
840
|
+
mock_http_client: MagicMock,
|
|
841
|
+
) -> None:
|
|
842
|
+
"""Test updating with empty applies_to_parts list to remove all associations."""
|
|
843
|
+
mock_response = MagicMock()
|
|
844
|
+
mock_response.json.return_value = {"article": mock_article.model_dump(mode="json")}
|
|
845
|
+
mock_http_client.post.return_value = mock_response
|
|
846
|
+
|
|
847
|
+
result = articles_service.update_with_content(
|
|
848
|
+
"article-123",
|
|
849
|
+
applies_to_parts=[],
|
|
850
|
+
)
|
|
851
|
+
|
|
852
|
+
assert result.id == "article-123"
|
|
853
|
+
# Verify empty list is passed to clear associations
|
|
854
|
+
post_call = mock_http_client.post.call_args
|
|
855
|
+
data = post_call[1]["data"]
|
|
856
|
+
assert "applies_to_parts" in data
|
|
857
|
+
assert data["applies_to_parts"]["set"] == []
|
|
858
|
+
|
|
779
859
|
|
|
780
860
|
# ============================================================================
|
|
781
861
|
# Async Tests
|
|
@@ -1363,3 +1443,86 @@ class TestUpdateWithContentAsync:
|
|
|
1363
1443
|
"article-123",
|
|
1364
1444
|
title="New",
|
|
1365
1445
|
)
|
|
1446
|
+
|
|
1447
|
+
@pytest.mark.asyncio
|
|
1448
|
+
async def test_async_update_with_content_applies_to_parts_only(
|
|
1449
|
+
self,
|
|
1450
|
+
async_articles_service: AsyncArticlesService,
|
|
1451
|
+
mock_article: Article,
|
|
1452
|
+
mock_async_http_client: MagicMock,
|
|
1453
|
+
) -> None:
|
|
1454
|
+
"""Test async updating only applies_to_parts."""
|
|
1455
|
+
mock_response = MagicMock()
|
|
1456
|
+
mock_response.json.return_value = {"article": mock_article.model_dump(mode="json")}
|
|
1457
|
+
mock_async_http_client.post.return_value = mock_response
|
|
1458
|
+
|
|
1459
|
+
result = await async_articles_service.update_with_content(
|
|
1460
|
+
"article-123",
|
|
1461
|
+
applies_to_parts=["don:core:dvrv-us-1:devo/1:product/1"],
|
|
1462
|
+
)
|
|
1463
|
+
|
|
1464
|
+
assert result.id == "article-123"
|
|
1465
|
+
# Verify update was called with applies_to_parts wrapped in set
|
|
1466
|
+
post_call = mock_async_http_client.post.call_args
|
|
1467
|
+
assert "articles.update" in post_call[0][0]
|
|
1468
|
+
data = post_call[1]["data"]
|
|
1469
|
+
assert "applies_to_parts" in data
|
|
1470
|
+
assert data["applies_to_parts"]["set"] == ["don:core:dvrv-us-1:devo/1:product/1"]
|
|
1471
|
+
|
|
1472
|
+
@pytest.mark.asyncio
|
|
1473
|
+
async def test_async_update_with_content_applies_to_parts_with_metadata(
|
|
1474
|
+
self,
|
|
1475
|
+
async_articles_service: AsyncArticlesService,
|
|
1476
|
+
mock_article: Article,
|
|
1477
|
+
mock_async_http_client: MagicMock,
|
|
1478
|
+
) -> None:
|
|
1479
|
+
"""Test async updating applies_to_parts along with other metadata."""
|
|
1480
|
+
mock_response = MagicMock()
|
|
1481
|
+
mock_response.json.return_value = {"article": mock_article.model_dump(mode="json")}
|
|
1482
|
+
mock_async_http_client.post.return_value = mock_response
|
|
1483
|
+
|
|
1484
|
+
result = await async_articles_service.update_with_content(
|
|
1485
|
+
"article-123",
|
|
1486
|
+
title="New Title",
|
|
1487
|
+
description="New description",
|
|
1488
|
+
applies_to_parts=[
|
|
1489
|
+
"don:core:dvrv-us-1:devo/1:capability/2",
|
|
1490
|
+
"don:core:dvrv-us-1:devo/1:feature/3",
|
|
1491
|
+
],
|
|
1492
|
+
)
|
|
1493
|
+
|
|
1494
|
+
assert result.id == "article-123"
|
|
1495
|
+
# Verify all metadata was passed including applies_to_parts
|
|
1496
|
+
post_call = mock_async_http_client.post.call_args
|
|
1497
|
+
data = post_call[1]["data"]
|
|
1498
|
+
assert data["title"] == "New Title"
|
|
1499
|
+
assert data["description"] == "New description"
|
|
1500
|
+
assert "applies_to_parts" in data
|
|
1501
|
+
assert data["applies_to_parts"]["set"] == [
|
|
1502
|
+
"don:core:dvrv-us-1:devo/1:capability/2",
|
|
1503
|
+
"don:core:dvrv-us-1:devo/1:feature/3",
|
|
1504
|
+
]
|
|
1505
|
+
|
|
1506
|
+
@pytest.mark.asyncio
|
|
1507
|
+
async def test_async_update_with_content_applies_to_parts_empty_list(
|
|
1508
|
+
self,
|
|
1509
|
+
async_articles_service: AsyncArticlesService,
|
|
1510
|
+
mock_article: Article,
|
|
1511
|
+
mock_async_http_client: MagicMock,
|
|
1512
|
+
) -> None:
|
|
1513
|
+
"""Test async updating with empty applies_to_parts list to remove all associations."""
|
|
1514
|
+
mock_response = MagicMock()
|
|
1515
|
+
mock_response.json.return_value = {"article": mock_article.model_dump(mode="json")}
|
|
1516
|
+
mock_async_http_client.post.return_value = mock_response
|
|
1517
|
+
|
|
1518
|
+
result = await async_articles_service.update_with_content(
|
|
1519
|
+
"article-123",
|
|
1520
|
+
applies_to_parts=[],
|
|
1521
|
+
)
|
|
1522
|
+
|
|
1523
|
+
assert result.id == "article-123"
|
|
1524
|
+
# Verify empty list is passed to clear associations
|
|
1525
|
+
post_call = mock_async_http_client.post.call_args
|
|
1526
|
+
data = post_call[1]["data"]
|
|
1527
|
+
assert "applies_to_parts" in data
|
|
1528
|
+
assert data["applies_to_parts"]["set"] == []
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/feature_request.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/claude-code-review.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|