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.
Files changed (380) hide show
  1. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/PKG-INFO +55 -4
  2. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/README.md +54 -3
  3. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/webhooks.md +2 -2
  4. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/changelog.md +14 -0
  5. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/examples/advanced.md +2 -2
  6. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/examples/integrations.md +1 -1
  7. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/cloud_functions/main.py +3 -3
  8. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/pyproject.toml +1 -1
  9. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/client.py +2 -2
  10. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/__init__.py +8 -0
  11. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/parts.py +94 -0
  12. devrev_python_sdk-3.2.0/src/devrev/services/parts.py +535 -0
  13. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/works.py +19 -1
  14. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/parts.py +53 -0
  15. devrev_python_sdk-3.2.0/tests/integration/test_parts_move_e2e.py +219 -0
  16. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/conftest.py +1 -0
  17. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_parts.py +130 -0
  18. devrev_python_sdk-3.2.0/tests/unit/models/test_parts_models.py +149 -0
  19. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/conftest.py +1 -1
  20. devrev_python_sdk-3.2.0/tests/unit/services/test_parts.py +822 -0
  21. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_webhooks.py +1 -1
  22. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_works.py +35 -0
  23. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/uv.lock +1 -1
  24. devrev_python_sdk-3.1.0/src/devrev/services/parts.py +0 -100
  25. devrev_python_sdk-3.1.0/tests/unit/services/test_parts.py +0 -141
  26. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/bug-fixer.md +0 -0
  27. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/builder.md +0 -0
  28. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/documentation.md +0 -0
  29. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/foreman.md +0 -0
  30. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/pr-review-boss.md +0 -0
  31. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/release-manager.md +0 -0
  32. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/simplifier.md +0 -0
  33. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/agents/tester.md +0 -0
  34. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/commands/foreman-work.md +0 -0
  35. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/commands/release-prepare.md +0 -0
  36. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/commands/review-start.md +0 -0
  37. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/commands/simplify-code.md +0 -0
  38. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/code-quality.md +0 -0
  39. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/data-modeling.md +0 -0
  40. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/devrev-sdk.md +0 -0
  41. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/git-workflow.md +0 -0
  42. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/pull-requests.md +0 -0
  43. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/python-development.md +0 -0
  44. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/security.md +0 -0
  45. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.augment/rules/testing.md +0 -0
  46. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.dockerignore +0 -0
  47. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.env.sample +0 -0
  48. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/ISSUE_TEMPLATE/article-artifact-simplification.md +0 -0
  49. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  50. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  51. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  52. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  53. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/dependabot.yml +0 -0
  54. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/pull_request_template.md +0 -0
  55. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/api-check.yml +0 -0
  56. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/ci.yml +0 -0
  57. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/claude-code-review.yml +0 -0
  58. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/deploy.yml +0 -0
  59. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/docs.yml +0 -0
  60. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/integration-tests.yml +0 -0
  61. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/release.yml +0 -0
  62. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.github/workflows/sync-openapi.yml +0 -0
  63. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.gitignore +0 -0
  64. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/.pre-commit-config.yaml +0 -0
  65. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/CLAUDE.md +0 -0
  66. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/CODE_OF_CONDUCT.md +0 -0
  67. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/CONTRIBUTING.md +0 -0
  68. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/DEPRECATIONS.md +0 -0
  69. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/Dockerfile +0 -0
  70. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/KNOWN_ISSUES.md +0 -0
  71. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/OPENAPI_SPEC_DISCREPANCIES.md +0 -0
  72. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/SECURITY.md +0 -0
  73. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/augment-mcp-config-remote.json +0 -0
  74. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/augment-mcp-config.json +0 -0
  75. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/augment-settings.json +0 -0
  76. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/benchmarks/README.md +0 -0
  77. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/benchmarks/bench_http_client.py +0 -0
  78. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/benchmarks/bench_models.py +0 -0
  79. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/benchmarks/bench_pagination.py +0 -0
  80. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/benchmarks/conftest.py +0 -0
  81. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/context7.json +0 -0
  82. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/README.md +0 -0
  83. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/audit-logging-setup.sh +0 -0
  84. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/cloudbuild.yaml +0 -0
  85. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/monitoring/README.md +0 -0
  86. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/monitoring/alert-policies.yaml +0 -0
  87. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/monitoring/dashboard.json +0 -0
  88. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/monitoring/validate-config.sh +0 -0
  89. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/deploy/service.yaml +0 -0
  90. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docker-compose.yml +0 -0
  91. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/brands.md +0 -0
  92. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/engagements.md +0 -0
  93. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/incidents.md +0 -0
  94. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/index.md +0 -0
  95. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/question-answers.md +0 -0
  96. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/recommendations.md +0 -0
  97. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/search.md +0 -0
  98. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta/uoms.md +0 -0
  99. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/beta-api-differences.md +0 -0
  100. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/client.md +0 -0
  101. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/config.md +0 -0
  102. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/exceptions.md +0 -0
  103. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/index.md +0 -0
  104. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/models/accounts.md +0 -0
  105. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/models/base.md +0 -0
  106. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/models/index.md +0 -0
  107. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/models/users.md +0 -0
  108. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/models/works.md +0 -0
  109. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/accounts.md +0 -0
  110. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/articles.md +0 -0
  111. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/code-changes.md +0 -0
  112. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/conversations.md +0 -0
  113. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/dev-users.md +0 -0
  114. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/groups.md +0 -0
  115. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/index.md +0 -0
  116. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/links.md +0 -0
  117. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/parts.md +0 -0
  118. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/rev-users.md +0 -0
  119. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/slas.md +0 -0
  120. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/tags.md +0 -0
  121. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/timeline-entries.md +0 -0
  122. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/api/services/works.md +0 -0
  123. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/examples/basic.md +0 -0
  124. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/examples/beta-features.md +0 -0
  125. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/examples/index.md +0 -0
  126. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/getting-started/authentication.md +0 -0
  127. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/getting-started/index.md +0 -0
  128. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/getting-started/installation.md +0 -0
  129. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/getting-started/quickstart.md +0 -0
  130. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/beta-api.md +0 -0
  131. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/compatibility.md +0 -0
  132. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/configuration.md +0 -0
  133. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/error-handling.md +0 -0
  134. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/github-actions-setup.md +0 -0
  135. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/index.md +0 -0
  136. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/logging.md +0 -0
  137. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/pagination.md +0 -0
  138. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/sync-vs-async.md +0 -0
  139. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/testing.md +0 -0
  140. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/version-support.md +0 -0
  141. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/guides/write-integration-testing-strategy.md +0 -0
  142. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/hooks/copy_llms.py +0 -0
  143. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/index.md +0 -0
  144. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/mcp/deployment.md +0 -0
  145. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/mcp/index.md +0 -0
  146. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/mcp/quickstart.md +0 -0
  147. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/mcp/tools-reference.md +0 -0
  148. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/docs/stylesheets/extra.css +0 -0
  149. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/README.md +0 -0
  150. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/basic/README.md +0 -0
  151. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/basic/async_example.py +0 -0
  152. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/basic/create_work.py +0 -0
  153. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/basic/error_handling.py +0 -0
  154. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/basic/list_accounts.py +0 -0
  155. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/basic/pagination.py +0 -0
  156. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/basic/search_users.py +0 -0
  157. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/cloud_functions/README.md +0 -0
  158. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/cloud_functions/requirements.txt +0 -0
  159. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/fastapi/README.md +0 -0
  160. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/fastapi/main.py +0 -0
  161. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/fastapi/requirements.txt +0 -0
  162. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/flask/README.md +0 -0
  163. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/flask/app.py +0 -0
  164. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/examples/integrations/flask/requirements.txt +0 -0
  165. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/llms-ctx-full.txt +0 -0
  166. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/llms-ctx.txt +0 -0
  167. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/llms-mcp.txt +0 -0
  168. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/llms.txt +0 -0
  169. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/mkdocs.yml +0 -0
  170. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/openapi-beta.yaml +0 -0
  171. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/openapi-public.yaml +0 -0
  172. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/openapi-spec-corrections.yaml +0 -0
  173. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/scripts/build_ai_docs.py +0 -0
  174. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/scripts/debug_articles.py +0 -0
  175. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/scripts/setup-github-secrets.sh +0 -0
  176. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/__init__.py +0 -0
  177. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/config.py +0 -0
  178. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/exceptions.py +0 -0
  179. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/accounts.py +0 -0
  180. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/articles.py +0 -0
  181. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/artifacts.py +0 -0
  182. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/base.py +0 -0
  183. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/brands.py +0 -0
  184. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/code_changes.py +0 -0
  185. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/conversations.py +0 -0
  186. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/dev_users.py +0 -0
  187. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/engagements.py +0 -0
  188. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/groups.py +0 -0
  189. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/incidents.py +0 -0
  190. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/links.py +0 -0
  191. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/notifications.py +0 -0
  192. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/preferences.py +0 -0
  193. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/question_answers.py +0 -0
  194. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/recommendations.py +0 -0
  195. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/rev_orgs.py +0 -0
  196. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/rev_users.py +0 -0
  197. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/search.py +0 -0
  198. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/slas.py +0 -0
  199. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/sync.py +0 -0
  200. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/tags.py +0 -0
  201. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/tasks.py +0 -0
  202. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/timeline_entries.py +0 -0
  203. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/timeline_events.py +0 -0
  204. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/track_events.py +0 -0
  205. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/uoms.py +0 -0
  206. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/webhooks.py +0 -0
  207. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/widgets.py +0 -0
  208. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/models/works.py +0 -0
  209. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/py.typed +0 -0
  210. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/__init__.py +0 -0
  211. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/_pagination.py +0 -0
  212. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/accounts.py +0 -0
  213. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/articles.py +0 -0
  214. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/artifacts.py +0 -0
  215. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/base.py +0 -0
  216. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/brands.py +0 -0
  217. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/code_changes.py +0 -0
  218. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/conversations.py +0 -0
  219. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/dev_users.py +0 -0
  220. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/engagements.py +0 -0
  221. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/groups.py +0 -0
  222. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/incidents.py +0 -0
  223. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/links.py +0 -0
  224. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/notifications.py +0 -0
  225. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/preferences.py +0 -0
  226. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/question_answers.py +0 -0
  227. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/recommendations.py +0 -0
  228. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/rev_orgs.py +0 -0
  229. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/rev_users.py +0 -0
  230. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/search.py +0 -0
  231. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/slas.py +0 -0
  232. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/tags.py +0 -0
  233. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/timeline_entries.py +0 -0
  234. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/track_events.py +0 -0
  235. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/uoms.py +0 -0
  236. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/services/webhooks.py +0 -0
  237. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/utils/__init__.py +0 -0
  238. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/utils/content_converter.py +0 -0
  239. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/utils/deprecation.py +0 -0
  240. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/utils/http.py +0 -0
  241. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/utils/logging.py +0 -0
  242. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev/utils/pagination.py +0 -0
  243. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/__init__.py +0 -0
  244. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/__main__.py +0 -0
  245. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/config.py +0 -0
  246. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/middleware/__init__.py +0 -0
  247. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/middleware/audit.py +0 -0
  248. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/middleware/auth.py +0 -0
  249. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/middleware/health.py +0 -0
  250. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/middleware/rate_limit.py +0 -0
  251. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/prompts/__init__.py +0 -0
  252. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/prompts/escalation.py +0 -0
  253. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/prompts/investigate.py +0 -0
  254. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/prompts/response.py +0 -0
  255. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/prompts/summarize.py +0 -0
  256. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/prompts/triage.py +0 -0
  257. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/__init__.py +0 -0
  258. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/account.py +0 -0
  259. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/article.py +0 -0
  260. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/conversation.py +0 -0
  261. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/part.py +0 -0
  262. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/server_info.py +0 -0
  263. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/ticket.py +0 -0
  264. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/resources/user.py +0 -0
  265. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/server.py +0 -0
  266. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/__init__.py +0 -0
  267. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/accounts.py +0 -0
  268. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/articles.py +0 -0
  269. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/conversations.py +0 -0
  270. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/engagements.py +0 -0
  271. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/groups.py +0 -0
  272. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/incidents.py +0 -0
  273. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/links.py +0 -0
  274. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/question_answers.py +0 -0
  275. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/recommendations.py +0 -0
  276. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/rev_orgs.py +0 -0
  277. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/search.py +0 -0
  278. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/server_info.py +0 -0
  279. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/slas.py +0 -0
  280. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/tags.py +0 -0
  281. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/timeline.py +0 -0
  282. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/users.py +0 -0
  283. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/webhooks.py +0 -0
  284. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/tools/works.py +0 -0
  285. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/utils/__init__.py +0 -0
  286. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/utils/don_id.py +0 -0
  287. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/utils/errors.py +0 -0
  288. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/utils/formatting.py +0 -0
  289. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/src/devrev_mcp/utils/pagination.py +0 -0
  290. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/__init__.py +0 -0
  291. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/conftest.py +0 -0
  292. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/__init__.py +0 -0
  293. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/conftest.py +0 -0
  294. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_accounts_e2e.py +0 -0
  295. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_all_readonly_endpoints.py +0 -0
  296. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_articles_lifecycle.py +0 -0
  297. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_backwards_compatibility.py +0 -0
  298. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_contacts_e2e.py +0 -0
  299. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_core_services_phase1.py +0 -0
  300. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_date_filtering.py +0 -0
  301. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_extended_services_phase2.py +0 -0
  302. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_get_endpoints.py +0 -0
  303. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_issues_e2e.py +0 -0
  304. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_kb_articles_e2e.py +0 -0
  305. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_mcp_articles.py +0 -0
  306. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_ping.py +0 -0
  307. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_question_answers_e2e.py +0 -0
  308. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_readonly_endpoints.py +0 -0
  309. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_specialized_services_phase3.py +0 -0
  310. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_tickets_e2e.py +0 -0
  311. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/test_write_operations.py +0 -0
  312. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/utils/__init__.py +0 -0
  313. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/utils/cleanup.py +0 -0
  314. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/utils/constants.py +0 -0
  315. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/integration/utils/data_manager.py +0 -0
  316. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/performance/__init__.py +0 -0
  317. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/performance/test_articles_performance.py +0 -0
  318. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/__init__.py +0 -0
  319. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/__init__.py +0 -0
  320. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_audit.py +0 -0
  321. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_config.py +0 -0
  322. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_phase4_transport.py +0 -0
  323. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_prompts.py +0 -0
  324. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_resources.py +0 -0
  325. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_server_info.py +0 -0
  326. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_accounts.py +0 -0
  327. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_articles.py +0 -0
  328. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_conversations.py +0 -0
  329. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_engagements.py +0 -0
  330. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_groups.py +0 -0
  331. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_incidents.py +0 -0
  332. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_links.py +0 -0
  333. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_question_answers.py +0 -0
  334. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_recommendations.py +0 -0
  335. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_search.py +0 -0
  336. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_slas.py +0 -0
  337. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_tags.py +0 -0
  338. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_timeline.py +0 -0
  339. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_users.py +0 -0
  340. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_webhooks.py +0 -0
  341. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_tools_works.py +0 -0
  342. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/mcp/test_utils.py +0 -0
  343. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/models/__init__.py +0 -0
  344. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/models/test_user_state_regression.py +0 -0
  345. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/__init__.py +0 -0
  346. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_articles.py +0 -0
  347. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_async_services.py +0 -0
  348. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_brands.py +0 -0
  349. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_code_changes.py +0 -0
  350. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_conversations.py +0 -0
  351. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_engagements.py +0 -0
  352. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_groups.py +0 -0
  353. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_incidents.py +0 -0
  354. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_links.py +0 -0
  355. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_notifications.py +0 -0
  356. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_pagination.py +0 -0
  357. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_preferences.py +0 -0
  358. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_question_answers.py +0 -0
  359. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_recommendations.py +0 -0
  360. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_search.py +0 -0
  361. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_slas.py +0 -0
  362. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_tags.py +0 -0
  363. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_timeline_entries.py +0 -0
  364. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_track_events.py +0 -0
  365. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/services/test_uoms.py +0 -0
  366. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_articles_unified.py +0 -0
  367. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_artifacts.py +0 -0
  368. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_backward_compatibility.py +0 -0
  369. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_base_service.py +0 -0
  370. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_client.py +0 -0
  371. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_config.py +0 -0
  372. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_content_converter.py +0 -0
  373. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_deprecation.py +0 -0
  374. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_don_id_validation.py +0 -0
  375. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_error_handling.py +0 -0
  376. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_exceptions.py +0 -0
  377. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_http.py +0 -0
  378. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_logging.py +0 -0
  379. {devrev_python_sdk-3.1.0 → devrev_python_sdk-3.2.0}/tests/unit/test_pagination.py +0 -0
  380. {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.1.0
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 | 5 | list, get, create, update, delete |
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/ # 78 MCP tools across 15 categories
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 | 5 | list, get, create, update, delete |
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/ # 78 MCP tools across 15 categories
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=["work.created", "work.updated"],
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=["work.created", "work.updated", "work.deleted"],
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("work.created")
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("work.updated")
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 == "work.created":
124
+ if event_type == "work_created":
125
125
  work = data.get("work", {})
126
126
  print(f"New work item: {work.get('title')}")
127
127
 
@@ -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 == "work.created":
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 == "work.updated":
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 == "conversation.created":
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "devrev-Python-SDK"
7
- version = "3.1.0"
7
+ version = "3.2.0"
8
8
  description = "A modern, type-safe Python SDK for the DevRev API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -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
+ )