devrev-Python-SDK 3.1.0__tar.gz → 3.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/PKG-INFO +55 -4
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/README.md +54 -3
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/webhooks.md +2 -2
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/changelog.md +14 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/examples/advanced.md +2 -2
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/examples/integrations.md +1 -1
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/cloud_functions/main.py +3 -3
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/pyproject.toml +1 -1
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/client.py +2 -2
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/__init__.py +8 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/parts.py +94 -0
- devrev_python_sdk-3.2.0/src/devrev/services/parts.py +535 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/works.py +19 -1
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/parts.py +53 -0
- devrev_python_sdk-3.2.0/tests/integration/test_parts_move_e2e.py +219 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/conftest.py +1 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_parts.py +130 -0
- devrev_python_sdk-3.2.0/tests/unit/models/test_parts_models.py +149 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/conftest.py +1 -1
- devrev_python_sdk-3.2.0/tests/unit/services/test_parts.py +822 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_webhooks.py +1 -1
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_works.py +35 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/uv.lock +1 -1
- devrev_python_sdk-3.1.0/src/devrev/services/parts.py +0 -100
- devrev_python_sdk-3.1.0/tests/unit/services/test_parts.py +0 -141
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/bug-fixer.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/builder.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/documentation.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/foreman.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/pr-review-boss.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/release-manager.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/simplifier.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/tester.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/commands/foreman-work.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/commands/release-prepare.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/commands/review-start.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/commands/simplify-code.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/code-quality.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/data-modeling.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/devrev-sdk.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/git-workflow.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/pull-requests.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/python-development.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/security.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/testing.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.dockerignore +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.env.sample +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/ISSUE_TEMPLATE/article-artifact-simplification.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/dependabot.yml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/pull_request_template.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/api-check.yml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/ci.yml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/claude-code-review.yml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/deploy.yml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/docs.yml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/integration-tests.yml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/release.yml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/sync-openapi.yml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.gitignore +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.pre-commit-config.yaml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/CLAUDE.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/CODE_OF_CONDUCT.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/CONTRIBUTING.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/DEPRECATIONS.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/Dockerfile +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/KNOWN_ISSUES.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/OPENAPI_SPEC_DISCREPANCIES.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/SECURITY.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/augment-mcp-config-remote.json +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/augment-mcp-config.json +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/augment-settings.json +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/benchmarks/README.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/benchmarks/bench_http_client.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/benchmarks/bench_models.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/benchmarks/bench_pagination.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/benchmarks/conftest.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/context7.json +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/README.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/audit-logging-setup.sh +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/cloudbuild.yaml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/monitoring/README.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/monitoring/alert-policies.yaml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/monitoring/dashboard.json +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/monitoring/validate-config.sh +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/service.yaml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docker-compose.yml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/brands.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/engagements.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/incidents.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/index.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/question-answers.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/recommendations.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/search.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/uoms.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta-api-differences.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/client.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/config.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/exceptions.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/index.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/models/accounts.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/models/base.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/models/index.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/models/users.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/models/works.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/accounts.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/articles.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/code-changes.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/conversations.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/dev-users.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/groups.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/index.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/links.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/parts.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/rev-users.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/slas.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/tags.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/timeline-entries.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/works.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/examples/basic.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/examples/beta-features.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/examples/index.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/getting-started/authentication.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/getting-started/index.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/getting-started/installation.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/getting-started/quickstart.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/beta-api.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/compatibility.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/configuration.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/error-handling.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/github-actions-setup.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/index.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/logging.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/pagination.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/sync-vs-async.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/testing.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/version-support.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/write-integration-testing-strategy.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/hooks/copy_llms.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/index.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/mcp/deployment.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/mcp/index.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/mcp/quickstart.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/mcp/tools-reference.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/stylesheets/extra.css +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/README.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/basic/README.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/basic/async_example.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/basic/create_work.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/basic/error_handling.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/basic/list_accounts.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/basic/pagination.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/basic/search_users.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/cloud_functions/README.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/cloud_functions/requirements.txt +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/fastapi/README.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/fastapi/main.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/fastapi/requirements.txt +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/flask/README.md +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/flask/app.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/flask/requirements.txt +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/llms-ctx-full.txt +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/llms-ctx.txt +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/llms-mcp.txt +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/llms.txt +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/mkdocs.yml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/openapi-beta.yaml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/openapi-public.yaml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/openapi-spec-corrections.yaml +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/scripts/build_ai_docs.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/scripts/debug_articles.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/scripts/setup-github-secrets.sh +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/config.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/exceptions.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/accounts.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/articles.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/artifacts.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/base.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/brands.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/code_changes.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/conversations.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/dev_users.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/engagements.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/groups.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/incidents.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/links.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/notifications.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/preferences.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/question_answers.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/recommendations.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/rev_orgs.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/rev_users.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/search.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/slas.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/sync.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/tags.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/tasks.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/timeline_entries.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/timeline_events.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/track_events.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/uoms.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/webhooks.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/widgets.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/works.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/py.typed +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/_pagination.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/accounts.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/articles.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/artifacts.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/base.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/brands.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/code_changes.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/conversations.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/dev_users.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/engagements.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/groups.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/incidents.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/links.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/notifications.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/preferences.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/question_answers.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/recommendations.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/rev_orgs.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/rev_users.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/search.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/slas.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/tags.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/timeline_entries.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/track_events.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/uoms.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/webhooks.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/utils/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/utils/content_converter.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/utils/deprecation.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/utils/http.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/utils/logging.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/utils/pagination.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/__main__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/config.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/middleware/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/middleware/audit.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/middleware/auth.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/middleware/health.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/middleware/rate_limit.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/prompts/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/prompts/escalation.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/prompts/investigate.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/prompts/response.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/prompts/summarize.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/prompts/triage.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/account.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/article.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/conversation.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/part.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/server_info.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/ticket.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/user.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/server.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/accounts.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/articles.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/conversations.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/engagements.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/groups.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/incidents.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/links.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/question_answers.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/recommendations.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/rev_orgs.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/search.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/server_info.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/slas.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/tags.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/timeline.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/users.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/webhooks.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/works.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/utils/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/utils/don_id.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/utils/errors.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/utils/formatting.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/utils/pagination.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/conftest.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/conftest.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_accounts_e2e.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_all_readonly_endpoints.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_articles_lifecycle.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_backwards_compatibility.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_contacts_e2e.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_core_services_phase1.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_date_filtering.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_extended_services_phase2.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_get_endpoints.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_issues_e2e.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_kb_articles_e2e.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_mcp_articles.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_ping.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_question_answers_e2e.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_readonly_endpoints.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_specialized_services_phase3.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_tickets_e2e.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_write_operations.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/utils/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/utils/cleanup.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/utils/constants.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/utils/data_manager.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/performance/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/performance/test_articles_performance.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_audit.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_config.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_phase4_transport.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_prompts.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_resources.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_server_info.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_accounts.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_articles.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_conversations.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_engagements.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_groups.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_incidents.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_links.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_question_answers.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_recommendations.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_search.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_slas.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_tags.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_timeline.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_users.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_webhooks.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_works.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_utils.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/models/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/models/test_user_state_regression.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/__init__.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_articles.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_async_services.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_brands.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_code_changes.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_conversations.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_engagements.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_groups.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_incidents.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_links.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_notifications.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_pagination.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_preferences.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_question_answers.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_recommendations.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_search.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_slas.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_tags.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_timeline_entries.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_track_events.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_uoms.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_articles_unified.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_artifacts.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_backward_compatibility.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_base_service.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_client.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_config.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_content_converter.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_deprecation.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_don_id_validation.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_error_handling.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_exceptions.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_http.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_logging.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_pagination.py +0 -0
- {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_rev_orgs.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devrev-Python-SDK
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.2.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
|
|
@@ -505,6 +505,57 @@ export_result = client.works.export(
|
|
|
505
505
|
)
|
|
506
506
|
```
|
|
507
507
|
|
|
508
|
+
### Managing Parts
|
|
509
|
+
|
|
510
|
+
```python
|
|
511
|
+
from devrev.models.parts import PartsCreateRequest, PartsMoveRequest, PartType
|
|
512
|
+
|
|
513
|
+
# Create a feature under a capability
|
|
514
|
+
feature = client.parts.create(PartsCreateRequest(
|
|
515
|
+
name="Bulk import",
|
|
516
|
+
type=PartType.FEATURE,
|
|
517
|
+
parent_part=["don:core:dvrv-us-1:devo/1:part/1"],
|
|
518
|
+
))
|
|
519
|
+
|
|
520
|
+
# Move (re-parent) a part under a new parent part
|
|
521
|
+
#
|
|
522
|
+
# The DevRev REST API only accepts `parent_part` on parts.create (not
|
|
523
|
+
# parts.update), so move() implements a recreate-and-relink workaround: it
|
|
524
|
+
# creates a new same-type part under the new parent (preserving name,
|
|
525
|
+
# description, owners and tags), relinks work items (applies_to_part) and child
|
|
526
|
+
# parts onto the new part, then deletes the original source part.
|
|
527
|
+
#
|
|
528
|
+
# CAVEAT: a real move is NOT an in-place update. It produces a NEW part id and
|
|
529
|
+
# DELETES the original part. Update any references you hold to the old id.
|
|
530
|
+
|
|
531
|
+
# Dry run first: returns the plan, mutates nothing.
|
|
532
|
+
plan = client.parts.move(PartsMoveRequest(
|
|
533
|
+
id=feature.id,
|
|
534
|
+
new_parent_part="don:core:dvrv-us-1:devo/1:part/2",
|
|
535
|
+
dry_run=True,
|
|
536
|
+
))
|
|
537
|
+
print(plan.plan.work_items_to_relink) # work items that would be relinked
|
|
538
|
+
print(plan.plan.child_parts_to_reparent) # child parts that would be re-parented
|
|
539
|
+
print(plan.plan.will_delete_source) # True -> the source part will be deleted
|
|
540
|
+
assert plan.source_deleted is False # nothing was changed by the dry run
|
|
541
|
+
|
|
542
|
+
# Real move: creates the new part, relinks dependents, deletes the source.
|
|
543
|
+
result = client.parts.move(PartsMoveRequest(
|
|
544
|
+
id=feature.id,
|
|
545
|
+
new_parent_part="don:core:dvrv-us-1:devo/1:part/2",
|
|
546
|
+
))
|
|
547
|
+
print(result.new_part_id) # the NEW part id (the source id is now deleted)
|
|
548
|
+
print(result.relinked_work_items)
|
|
549
|
+
print(result.reparented_children)
|
|
550
|
+
print(result.source_deleted) # True
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
> **Note**: `move` requires the parts service be accessed via the client
|
|
554
|
+
> (`client.parts`) because it coordinates with the works service to relink work
|
|
555
|
+
> items. Via the MCP server, this is the `devrev_parts_move` tool, which is
|
|
556
|
+
> gated behind `MCP_ENABLE_DESTRUCTIVE_TOOLS=true` (it creates and deletes
|
|
557
|
+
> parts).
|
|
558
|
+
|
|
508
559
|
### Articles and Knowledge Base
|
|
509
560
|
|
|
510
561
|
```python
|
|
@@ -995,7 +1046,7 @@ All settings are configurable via environment variables (prefix `MCP_`):
|
|
|
995
1046
|
| Users | 5 | dev list/get, rev list/get/create |
|
|
996
1047
|
| Conversations | 6 | list, get, create, update, delete, export |
|
|
997
1048
|
| Articles | 6 | list, get, create, update, delete, count |
|
|
998
|
-
| Parts |
|
|
1049
|
+
| Parts | 6 | list, get, create, update, delete, move |
|
|
999
1050
|
| Tags | 5 | list, get, create, update, delete |
|
|
1000
1051
|
| Groups | 8 | list, get, create, update, delete, add/remove member, count |
|
|
1001
1052
|
| Timeline | 5 | list, get, create, update, delete |
|
|
@@ -1028,13 +1079,13 @@ py-devrev/
|
|
|
1028
1079
|
│ ├── __main__.py # CLI entry point
|
|
1029
1080
|
│ ├── server.py # FastMCP server setup & lifecycle
|
|
1030
1081
|
│ ├── config.py # MCPServerConfig (pydantic-settings)
|
|
1031
|
-
│ ├── tools/ #
|
|
1082
|
+
│ ├── tools/ # 79 MCP tools across 15 categories
|
|
1032
1083
|
│ │ ├── works.py # Works: list, get, create, update, delete, count, search
|
|
1033
1084
|
│ │ ├── accounts.py # Accounts: list, get, create, update, delete, merge
|
|
1034
1085
|
│ │ ├── users.py # Users: list/get dev users, list/get rev users, whoami
|
|
1035
1086
|
│ │ ├── conversations.py # Conversations: list, get, create, update, delete, export
|
|
1036
1087
|
│ │ ├── articles.py # Articles: list, get, create, update, delete, count
|
|
1037
|
-
│ │ ├── parts.py # Parts: list, get, create, update, delete
|
|
1088
|
+
│ │ ├── parts.py # Parts: list, get, create, update, delete, move
|
|
1038
1089
|
│ │ ├── tags.py # Tags: list, get, create, update, delete
|
|
1039
1090
|
│ │ ├── groups.py # Groups: CRUD + member management + count
|
|
1040
1091
|
│ │ ├── timeline.py # Timeline: list, get, create, update, delete
|
|
@@ -430,6 +430,57 @@ export_result = client.works.export(
|
|
|
430
430
|
)
|
|
431
431
|
```
|
|
432
432
|
|
|
433
|
+
### Managing Parts
|
|
434
|
+
|
|
435
|
+
```python
|
|
436
|
+
from devrev.models.parts import PartsCreateRequest, PartsMoveRequest, PartType
|
|
437
|
+
|
|
438
|
+
# Create a feature under a capability
|
|
439
|
+
feature = client.parts.create(PartsCreateRequest(
|
|
440
|
+
name="Bulk import",
|
|
441
|
+
type=PartType.FEATURE,
|
|
442
|
+
parent_part=["don:core:dvrv-us-1:devo/1:part/1"],
|
|
443
|
+
))
|
|
444
|
+
|
|
445
|
+
# Move (re-parent) a part under a new parent part
|
|
446
|
+
#
|
|
447
|
+
# The DevRev REST API only accepts `parent_part` on parts.create (not
|
|
448
|
+
# parts.update), so move() implements a recreate-and-relink workaround: it
|
|
449
|
+
# creates a new same-type part under the new parent (preserving name,
|
|
450
|
+
# description, owners and tags), relinks work items (applies_to_part) and child
|
|
451
|
+
# parts onto the new part, then deletes the original source part.
|
|
452
|
+
#
|
|
453
|
+
# CAVEAT: a real move is NOT an in-place update. It produces a NEW part id and
|
|
454
|
+
# DELETES the original part. Update any references you hold to the old id.
|
|
455
|
+
|
|
456
|
+
# Dry run first: returns the plan, mutates nothing.
|
|
457
|
+
plan = client.parts.move(PartsMoveRequest(
|
|
458
|
+
id=feature.id,
|
|
459
|
+
new_parent_part="don:core:dvrv-us-1:devo/1:part/2",
|
|
460
|
+
dry_run=True,
|
|
461
|
+
))
|
|
462
|
+
print(plan.plan.work_items_to_relink) # work items that would be relinked
|
|
463
|
+
print(plan.plan.child_parts_to_reparent) # child parts that would be re-parented
|
|
464
|
+
print(plan.plan.will_delete_source) # True -> the source part will be deleted
|
|
465
|
+
assert plan.source_deleted is False # nothing was changed by the dry run
|
|
466
|
+
|
|
467
|
+
# Real move: creates the new part, relinks dependents, deletes the source.
|
|
468
|
+
result = client.parts.move(PartsMoveRequest(
|
|
469
|
+
id=feature.id,
|
|
470
|
+
new_parent_part="don:core:dvrv-us-1:devo/1:part/2",
|
|
471
|
+
))
|
|
472
|
+
print(result.new_part_id) # the NEW part id (the source id is now deleted)
|
|
473
|
+
print(result.relinked_work_items)
|
|
474
|
+
print(result.reparented_children)
|
|
475
|
+
print(result.source_deleted) # True
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
> **Note**: `move` requires the parts service be accessed via the client
|
|
479
|
+
> (`client.parts`) because it coordinates with the works service to relink work
|
|
480
|
+
> items. Via the MCP server, this is the `devrev_parts_move` tool, which is
|
|
481
|
+
> gated behind `MCP_ENABLE_DESTRUCTIVE_TOOLS=true` (it creates and deletes
|
|
482
|
+
> parts).
|
|
483
|
+
|
|
433
484
|
### Articles and Knowledge Base
|
|
434
485
|
|
|
435
486
|
```python
|
|
@@ -920,7 +971,7 @@ All settings are configurable via environment variables (prefix `MCP_`):
|
|
|
920
971
|
| Users | 5 | dev list/get, rev list/get/create |
|
|
921
972
|
| Conversations | 6 | list, get, create, update, delete, export |
|
|
922
973
|
| Articles | 6 | list, get, create, update, delete, count |
|
|
923
|
-
| Parts |
|
|
974
|
+
| Parts | 6 | list, get, create, update, delete, move |
|
|
924
975
|
| Tags | 5 | list, get, create, update, delete |
|
|
925
976
|
| Groups | 8 | list, get, create, update, delete, add/remove member, count |
|
|
926
977
|
| Timeline | 5 | list, get, create, update, delete |
|
|
@@ -953,13 +1004,13 @@ py-devrev/
|
|
|
953
1004
|
│ ├── __main__.py # CLI entry point
|
|
954
1005
|
│ ├── server.py # FastMCP server setup & lifecycle
|
|
955
1006
|
│ ├── config.py # MCPServerConfig (pydantic-settings)
|
|
956
|
-
│ ├── tools/ #
|
|
1007
|
+
│ ├── tools/ # 79 MCP tools across 15 categories
|
|
957
1008
|
│ │ ├── works.py # Works: list, get, create, update, delete, count, search
|
|
958
1009
|
│ │ ├── accounts.py # Accounts: list, get, create, update, delete, merge
|
|
959
1010
|
│ │ ├── users.py # Users: list/get dev users, list/get rev users, whoami
|
|
960
1011
|
│ │ ├── conversations.py # Conversations: list, get, create, update, delete, export
|
|
961
1012
|
│ │ ├── articles.py # Articles: list, get, create, update, delete, count
|
|
962
|
-
│ │ ├── parts.py # Parts: list, get, create, update, delete
|
|
1013
|
+
│ │ ├── parts.py # Parts: list, get, create, update, delete, move
|
|
963
1014
|
│ │ ├── tags.py # Tags: list, get, create, update, delete
|
|
964
1015
|
│ │ ├── groups.py # Groups: CRUD + member management + count
|
|
965
1016
|
│ │ ├── timeline.py # Timeline: list, get, create, update, delete
|
|
@@ -35,7 +35,7 @@ import os
|
|
|
35
35
|
|
|
36
36
|
response = client.webhooks.create(
|
|
37
37
|
url="https://your-server.com/webhooks/devrev",
|
|
38
|
-
event_types=["
|
|
38
|
+
event_types=["work_created", "work_updated"],
|
|
39
39
|
secret=os.environ["WEBHOOK_SECRET"], # Never hardcode!
|
|
40
40
|
)
|
|
41
41
|
print(f"Created: {response.webhook.id}")
|
|
@@ -46,7 +46,7 @@ print(f"Created: {response.webhook.id}")
|
|
|
46
46
|
```python
|
|
47
47
|
response = client.webhooks.update(
|
|
48
48
|
id="don:integration:dvrv-us-1:devo/1:webhook/123",
|
|
49
|
-
event_types=["
|
|
49
|
+
event_types=["work_created", "work_updated", "work_deleted"],
|
|
50
50
|
)
|
|
51
51
|
```
|
|
52
52
|
|
|
@@ -13,6 +13,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
13
13
|
|
|
14
14
|
### Fixed
|
|
15
15
|
|
|
16
|
+
## [3.1.1] - 2026-06-16
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- **Webhook event-type examples reconciled to underscore form** (CSS-1042) —
|
|
21
|
+
Pre-existing examples and docs that used the dotted DevRev webhook
|
|
22
|
+
event-type form (`work.created`) now use the canonical underscore form
|
|
23
|
+
(`work_created`, `work_updated`, `work_deleted`, `conversation_created`),
|
|
24
|
+
matching the form DevRev sends in webhook payloads and the form already used
|
|
25
|
+
by the README, SDK docs, and the webhooks MCP advisory. This corrects a
|
|
26
|
+
latent bug in the Google Cloud Functions example, whose handler compared the
|
|
27
|
+
incoming payload `type` against dotted strings that never matched.
|
|
28
|
+
Docs/examples only; no SDK or MCP behavior change.
|
|
29
|
+
|
|
16
30
|
## [3.1.0] - 2026-06-16
|
|
17
31
|
|
|
18
32
|
### Added
|
|
@@ -123,11 +123,11 @@ class WebhookHandler:
|
|
|
123
123
|
# Usage example
|
|
124
124
|
webhook = WebhookHandler(secret="your-webhook-secret")
|
|
125
125
|
|
|
126
|
-
@webhook.on("
|
|
126
|
+
@webhook.on("work_created")
|
|
127
127
|
def handle_work_created(data):
|
|
128
128
|
print(f"New work item: {data['work']['title']}")
|
|
129
129
|
|
|
130
|
-
@webhook.on("
|
|
130
|
+
@webhook.on("work_updated")
|
|
131
131
|
def handle_work_updated(data):
|
|
132
132
|
print(f"Work updated: {data['work']['id']}")
|
|
133
133
|
```
|
|
@@ -121,7 +121,7 @@ def handle_webhook(request: Request):
|
|
|
121
121
|
data = request.get_json()
|
|
122
122
|
event_type = data.get("type")
|
|
123
123
|
|
|
124
|
-
if event_type == "
|
|
124
|
+
if event_type == "work_created":
|
|
125
125
|
work = data.get("work", {})
|
|
126
126
|
print(f"New work item: {work.get('title')}")
|
|
127
127
|
|
{devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/cloud_functions/main.py
RENAMED
|
@@ -41,17 +41,17 @@ def handle_webhook(request: Request) -> tuple[dict[str, Any], int]:
|
|
|
41
41
|
print(f"Received webhook: {event_type}")
|
|
42
42
|
|
|
43
43
|
# Process different event types
|
|
44
|
-
if event_type == "
|
|
44
|
+
if event_type == "work_created":
|
|
45
45
|
work = data.get("work", {})
|
|
46
46
|
print(f"New work item created: {work.get('title')}")
|
|
47
47
|
# Add your processing logic here
|
|
48
48
|
|
|
49
|
-
elif event_type == "
|
|
49
|
+
elif event_type == "work_updated":
|
|
50
50
|
work = data.get("work", {})
|
|
51
51
|
print(f"Work item updated: {work.get('id')}")
|
|
52
52
|
# Add your processing logic here
|
|
53
53
|
|
|
54
|
-
elif event_type == "
|
|
54
|
+
elif event_type == "conversation_created":
|
|
55
55
|
conv = data.get("conversation", {})
|
|
56
56
|
print(f"New conversation: {conv.get('id')}")
|
|
57
57
|
# Add your processing logic here
|
|
@@ -160,7 +160,7 @@ class DevRevClient:
|
|
|
160
160
|
self._dev_users = DevUsersService(self._http)
|
|
161
161
|
self._groups = GroupsService(self._http)
|
|
162
162
|
self._links = LinksService(self._http)
|
|
163
|
-
self._parts = PartsService(self._http)
|
|
163
|
+
self._parts = PartsService(self._http, parent_client=self)
|
|
164
164
|
self._rev_orgs = RevOrgsService(self._http)
|
|
165
165
|
self._rev_users = RevUsersService(self._http)
|
|
166
166
|
self._slas = SlasService(self._http)
|
|
@@ -488,7 +488,7 @@ class AsyncDevRevClient:
|
|
|
488
488
|
self._dev_users = AsyncDevUsersService(self._http)
|
|
489
489
|
self._groups = AsyncGroupsService(self._http)
|
|
490
490
|
self._links = AsyncLinksService(self._http)
|
|
491
|
-
self._parts = AsyncPartsService(self._http)
|
|
491
|
+
self._parts = AsyncPartsService(self._http, parent_client=self)
|
|
492
492
|
self._rev_orgs = AsyncRevOrgsService(self._http)
|
|
493
493
|
self._rev_users = AsyncRevUsersService(self._http)
|
|
494
494
|
self._slas = AsyncSlasService(self._http)
|
|
@@ -217,6 +217,7 @@ from devrev.models.notifications import (
|
|
|
217
217
|
NotificationsSendResponse,
|
|
218
218
|
)
|
|
219
219
|
from devrev.models.parts import (
|
|
220
|
+
ParentPartFilter,
|
|
220
221
|
Part,
|
|
221
222
|
PartsCreateRequest,
|
|
222
223
|
PartsCreateResponse,
|
|
@@ -226,6 +227,9 @@ from devrev.models.parts import (
|
|
|
226
227
|
PartsGetResponse,
|
|
227
228
|
PartsListRequest,
|
|
228
229
|
PartsListResponse,
|
|
230
|
+
PartsMovePlan,
|
|
231
|
+
PartsMoveRequest,
|
|
232
|
+
PartsMoveResult,
|
|
229
233
|
PartSummary,
|
|
230
234
|
PartsUpdateRequest,
|
|
231
235
|
PartsUpdateResponse,
|
|
@@ -669,6 +673,7 @@ __all__ = [
|
|
|
669
673
|
"NotificationsSendRequest",
|
|
670
674
|
"NotificationsSendResponse",
|
|
671
675
|
# Parts
|
|
676
|
+
"ParentPartFilter",
|
|
672
677
|
"Part",
|
|
673
678
|
"PartSummary",
|
|
674
679
|
"PartType",
|
|
@@ -682,6 +687,9 @@ __all__ = [
|
|
|
682
687
|
"PartsUpdateResponse",
|
|
683
688
|
"PartsDeleteRequest",
|
|
684
689
|
"PartsDeleteResponse",
|
|
690
|
+
"PartsMoveRequest",
|
|
691
|
+
"PartsMovePlan",
|
|
692
|
+
"PartsMoveResult",
|
|
685
693
|
# Preferences
|
|
686
694
|
"Preferences",
|
|
687
695
|
"PreferencesGetRequest",
|
|
@@ -11,6 +11,7 @@ from devrev.models.base import (
|
|
|
11
11
|
DevRevBaseModel,
|
|
12
12
|
DevRevResponseModel,
|
|
13
13
|
PaginatedResponse,
|
|
14
|
+
TagWithValue,
|
|
14
15
|
UserSummary,
|
|
15
16
|
)
|
|
16
17
|
|
|
@@ -33,6 +34,7 @@ class Part(DevRevResponseModel):
|
|
|
33
34
|
type: PartType | None = Field(default=None, description="Part type")
|
|
34
35
|
description: str | None = Field(default=None, description="Description")
|
|
35
36
|
owned_by: list[UserSummary] | None = Field(default=None, description="Owners")
|
|
37
|
+
tags: list[TagWithValue] | None = Field(default=None, description="Tags")
|
|
36
38
|
created_date: datetime | None = Field(default=None, description="Creation date")
|
|
37
39
|
modified_date: datetime | None = Field(default=None, description="Last modified")
|
|
38
40
|
|
|
@@ -87,12 +89,32 @@ class PartsDeleteRequest(DevRevBaseModel):
|
|
|
87
89
|
id: str = Field(..., description="Part ID to delete")
|
|
88
90
|
|
|
89
91
|
|
|
92
|
+
class ParentPartFilter(DevRevBaseModel):
|
|
93
|
+
"""Hierarchy filter for ``parts.list`` to fetch parts under given parents.
|
|
94
|
+
|
|
95
|
+
Mirrors the DevRev ``parent_part`` query filter. ``parts`` lists the parent
|
|
96
|
+
part IDs to fetch the hierarchy for (required), and ``level`` optionally
|
|
97
|
+
bounds how many levels of the hierarchy to return (``level=1`` returns the
|
|
98
|
+
direct children of the given parents).
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
parts: list[str] = Field(
|
|
102
|
+
..., min_length=1, description="Parent part IDs to fetch the hierarchy for"
|
|
103
|
+
)
|
|
104
|
+
level: int | None = Field(
|
|
105
|
+
default=None, ge=1, description="Number of levels of the hierarchy to fetch"
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
90
109
|
class PartsListRequest(DevRevBaseModel):
|
|
91
110
|
"""Request to list parts."""
|
|
92
111
|
|
|
93
112
|
cursor: str | None = Field(default=None, description="Pagination cursor")
|
|
94
113
|
limit: int | None = Field(default=None, ge=1, le=100, description="Max results")
|
|
95
114
|
type: list[PartType] | None = Field(default=None, description="Filter by type")
|
|
115
|
+
parent_part: ParentPartFilter | None = Field(
|
|
116
|
+
default=None, description="Filter by parent part hierarchy"
|
|
117
|
+
)
|
|
96
118
|
|
|
97
119
|
|
|
98
120
|
class PartsUpdateRequest(DevRevBaseModel):
|
|
@@ -131,3 +153,75 @@ class PartsDeleteResponse(DevRevResponseModel):
|
|
|
131
153
|
"""Response from deleting a part."""
|
|
132
154
|
|
|
133
155
|
pass
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
class PartsMoveRequest(DevRevBaseModel):
|
|
159
|
+
"""Request to move (re-parent) a part.
|
|
160
|
+
|
|
161
|
+
The DevRev REST API only accepts ``parent_part`` on ``parts.create``, not
|
|
162
|
+
``parts.update``. This SDK-level convenience request describes a higher-level
|
|
163
|
+
"move" operation that re-parents a part by recreating it under a new parent
|
|
164
|
+
and relinking its dependents. It is NOT a direct DevRev API request body.
|
|
165
|
+
"""
|
|
166
|
+
|
|
167
|
+
id: str = Field(..., description="ID of the part to move (re-parent)")
|
|
168
|
+
new_parent_part: str = Field(
|
|
169
|
+
..., description="Target parent part ID under which the part should be moved"
|
|
170
|
+
)
|
|
171
|
+
dry_run: bool = Field(
|
|
172
|
+
default=False,
|
|
173
|
+
description="If True, compute and return the move plan without executing it",
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class PartsMovePlan(DevRevResponseModel):
|
|
178
|
+
"""Plan describing what a part move (re-parent) would do.
|
|
179
|
+
|
|
180
|
+
Computed before (or instead of, for a dry run) executing a move so callers
|
|
181
|
+
can review the dependents that will be relinked or re-parented.
|
|
182
|
+
"""
|
|
183
|
+
|
|
184
|
+
source_part_id: str = Field(..., description="ID of the part to be moved")
|
|
185
|
+
source_part_type: str | None = Field(
|
|
186
|
+
default=None, description="Type of the source part (product, capability, etc.)"
|
|
187
|
+
)
|
|
188
|
+
new_parent_part: str = Field(
|
|
189
|
+
..., description="Target parent part ID the source will be moved under"
|
|
190
|
+
)
|
|
191
|
+
work_items_to_relink: list[str] = Field(
|
|
192
|
+
default_factory=list,
|
|
193
|
+
description="IDs of work items currently applies_to the source part that will be relinked",
|
|
194
|
+
)
|
|
195
|
+
child_parts_to_reparent: list[str] = Field(
|
|
196
|
+
default_factory=list,
|
|
197
|
+
description="IDs of child parts of the source that will be re-parented",
|
|
198
|
+
)
|
|
199
|
+
will_delete_source: bool = Field(
|
|
200
|
+
default=False,
|
|
201
|
+
description="Whether the original source part will be deleted after the move",
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
class PartsMoveResult(DevRevResponseModel):
|
|
206
|
+
"""Outcome of an executed (or dry-run) part move (re-parent) operation."""
|
|
207
|
+
|
|
208
|
+
new_part_id: str = Field(..., description="ID of the newly created part under the new parent")
|
|
209
|
+
source_part_id: str = Field(..., description="ID of the original source part that was moved")
|
|
210
|
+
relinked_work_items: list[str] = Field(
|
|
211
|
+
default_factory=list,
|
|
212
|
+
description="IDs of work items that were relinked from the source to the new part",
|
|
213
|
+
)
|
|
214
|
+
reparented_children: list[str] = Field(
|
|
215
|
+
default_factory=list,
|
|
216
|
+
description="IDs of child parts that were re-parented under the new part",
|
|
217
|
+
)
|
|
218
|
+
source_deleted: bool = Field(
|
|
219
|
+
default=False, description="Whether the original source part was deleted"
|
|
220
|
+
)
|
|
221
|
+
dry_run: bool = Field(
|
|
222
|
+
default=False,
|
|
223
|
+
description="Whether this result describes a dry run (no changes were applied)",
|
|
224
|
+
)
|
|
225
|
+
plan: PartsMovePlan = Field(
|
|
226
|
+
..., description="The move plan that was computed for this operation"
|
|
227
|
+
)
|