devrev-Python-SDK 2.8.1__tar.gz → 2.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/PKG-INFO +8 -1
  2. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/README.md +7 -0
  3. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/articles.md +7 -0
  4. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/changelog.md +6 -0
  5. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/mcp/tools-reference.md +1 -0
  6. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/pyproject.toml +1 -1
  7. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/articles.py +37 -2
  8. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/articles.py +9 -0
  9. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/conftest.py +2 -0
  10. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_articles.py +50 -0
  11. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_articles_unified.py +163 -0
  12. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/bug-fixer.md +0 -0
  13. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/builder.md +0 -0
  14. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/documentation.md +0 -0
  15. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/foreman.md +0 -0
  16. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/pr-review-boss.md +0 -0
  17. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/release-manager.md +0 -0
  18. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/simplifier.md +0 -0
  19. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/agents/tester.md +0 -0
  20. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/commands/foreman-work.md +0 -0
  21. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/commands/release-prepare.md +0 -0
  22. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/commands/review-start.md +0 -0
  23. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/commands/simplify-code.md +0 -0
  24. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/code-quality.md +0 -0
  25. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/data-modeling.md +0 -0
  26. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/devrev-sdk.md +0 -0
  27. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/git-workflow.md +0 -0
  28. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/pull-requests.md +0 -0
  29. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/python-development.md +0 -0
  30. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/security.md +0 -0
  31. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.augment/rules/testing.md +0 -0
  32. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.dockerignore +0 -0
  33. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.env.sample +0 -0
  34. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/article-artifact-simplification.md +0 -0
  35. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  36. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  37. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  38. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  39. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/dependabot.yml +0 -0
  40. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/pull_request_template.md +0 -0
  41. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/api-check.yml +0 -0
  42. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/ci.yml +0 -0
  43. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/claude-code-review.yml +0 -0
  44. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/claude.yml +0 -0
  45. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/deploy.yml +0 -0
  46. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/docs.yml +0 -0
  47. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/integration-tests.yml +0 -0
  48. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/release.yml +0 -0
  49. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.github/workflows/sync-openapi.yml +0 -0
  50. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.gitignore +0 -0
  51. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/.pre-commit-config.yaml +0 -0
  52. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/CLAUDE.md +0 -0
  53. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/CODE_OF_CONDUCT.md +0 -0
  54. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/CONTRIBUTING.md +0 -0
  55. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/DEPRECATIONS.md +0 -0
  56. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/Dockerfile +0 -0
  57. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/KNOWN_ISSUES.md +0 -0
  58. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/OPENAPI_SPEC_DISCREPANCIES.md +0 -0
  59. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/SECURITY.md +0 -0
  60. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/augment-mcp-config-remote.json +0 -0
  61. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/augment-mcp-config.json +0 -0
  62. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/augment-settings.json +0 -0
  63. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/benchmarks/README.md +0 -0
  64. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/benchmarks/bench_http_client.py +0 -0
  65. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/benchmarks/bench_models.py +0 -0
  66. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/benchmarks/bench_pagination.py +0 -0
  67. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/benchmarks/conftest.py +0 -0
  68. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/context7.json +0 -0
  69. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/README.md +0 -0
  70. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/audit-logging-setup.sh +0 -0
  71. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/cloudbuild.yaml +0 -0
  72. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/monitoring/README.md +0 -0
  73. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/monitoring/alert-policies.yaml +0 -0
  74. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/monitoring/dashboard.json +0 -0
  75. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/monitoring/validate-config.sh +0 -0
  76. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/deploy/service.yaml +0 -0
  77. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docker-compose.yml +0 -0
  78. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/brands.md +0 -0
  79. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/engagements.md +0 -0
  80. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/incidents.md +0 -0
  81. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/index.md +0 -0
  82. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/question-answers.md +0 -0
  83. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/recommendations.md +0 -0
  84. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/search.md +0 -0
  85. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta/uoms.md +0 -0
  86. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/beta-api-differences.md +0 -0
  87. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/client.md +0 -0
  88. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/config.md +0 -0
  89. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/exceptions.md +0 -0
  90. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/index.md +0 -0
  91. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/models/accounts.md +0 -0
  92. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/models/base.md +0 -0
  93. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/models/index.md +0 -0
  94. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/models/users.md +0 -0
  95. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/models/works.md +0 -0
  96. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/accounts.md +0 -0
  97. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/code-changes.md +0 -0
  98. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/conversations.md +0 -0
  99. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/dev-users.md +0 -0
  100. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/groups.md +0 -0
  101. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/index.md +0 -0
  102. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/links.md +0 -0
  103. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/parts.md +0 -0
  104. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/rev-users.md +0 -0
  105. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/slas.md +0 -0
  106. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/tags.md +0 -0
  107. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/timeline-entries.md +0 -0
  108. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/webhooks.md +0 -0
  109. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/api/services/works.md +0 -0
  110. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/examples/advanced.md +0 -0
  111. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/examples/basic.md +0 -0
  112. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/examples/beta-features.md +0 -0
  113. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/examples/index.md +0 -0
  114. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/examples/integrations.md +0 -0
  115. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/getting-started/authentication.md +0 -0
  116. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/getting-started/index.md +0 -0
  117. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/getting-started/installation.md +0 -0
  118. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/getting-started/quickstart.md +0 -0
  119. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/beta-api.md +0 -0
  120. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/compatibility.md +0 -0
  121. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/configuration.md +0 -0
  122. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/error-handling.md +0 -0
  123. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/github-actions-setup.md +0 -0
  124. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/index.md +0 -0
  125. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/logging.md +0 -0
  126. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/pagination.md +0 -0
  127. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/sync-vs-async.md +0 -0
  128. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/testing.md +0 -0
  129. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/version-support.md +0 -0
  130. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/guides/write-integration-testing-strategy.md +0 -0
  131. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/hooks/copy_llms.py +0 -0
  132. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/index.md +0 -0
  133. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/mcp/deployment.md +0 -0
  134. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/mcp/index.md +0 -0
  135. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/mcp/quickstart.md +0 -0
  136. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/docs/stylesheets/extra.css +0 -0
  137. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/README.md +0 -0
  138. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/basic/README.md +0 -0
  139. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/basic/async_example.py +0 -0
  140. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/basic/create_work.py +0 -0
  141. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/basic/error_handling.py +0 -0
  142. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/basic/list_accounts.py +0 -0
  143. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/basic/pagination.py +0 -0
  144. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/basic/search_users.py +0 -0
  145. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/cloud_functions/README.md +0 -0
  146. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/cloud_functions/main.py +0 -0
  147. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/cloud_functions/requirements.txt +0 -0
  148. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/fastapi/README.md +0 -0
  149. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/fastapi/main.py +0 -0
  150. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/fastapi/requirements.txt +0 -0
  151. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/flask/README.md +0 -0
  152. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/flask/app.py +0 -0
  153. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/examples/integrations/flask/requirements.txt +0 -0
  154. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/llms-ctx-full.txt +0 -0
  155. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/llms-ctx.txt +0 -0
  156. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/llms-mcp.txt +0 -0
  157. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/llms.txt +0 -0
  158. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/mkdocs.yml +0 -0
  159. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/openapi-beta.yaml +0 -0
  160. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/openapi-public.yaml +0 -0
  161. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/openapi-spec-corrections.yaml +0 -0
  162. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/scripts/build_ai_docs.py +0 -0
  163. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/scripts/setup-github-secrets.sh +0 -0
  164. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/__init__.py +0 -0
  165. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/client.py +0 -0
  166. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/config.py +0 -0
  167. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/exceptions.py +0 -0
  168. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/__init__.py +0 -0
  169. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/accounts.py +0 -0
  170. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/articles.py +0 -0
  171. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/artifacts.py +0 -0
  172. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/base.py +0 -0
  173. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/brands.py +0 -0
  174. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/code_changes.py +0 -0
  175. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/conversations.py +0 -0
  176. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/dev_users.py +0 -0
  177. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/engagements.py +0 -0
  178. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/groups.py +0 -0
  179. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/incidents.py +0 -0
  180. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/links.py +0 -0
  181. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/notifications.py +0 -0
  182. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/parts.py +0 -0
  183. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/preferences.py +0 -0
  184. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/question_answers.py +0 -0
  185. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/recommendations.py +0 -0
  186. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/rev_users.py +0 -0
  187. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/search.py +0 -0
  188. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/slas.py +0 -0
  189. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/sync.py +0 -0
  190. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/tags.py +0 -0
  191. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/tasks.py +0 -0
  192. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/timeline_entries.py +0 -0
  193. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/timeline_events.py +0 -0
  194. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/track_events.py +0 -0
  195. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/uoms.py +0 -0
  196. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/webhooks.py +0 -0
  197. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/widgets.py +0 -0
  198. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/models/works.py +0 -0
  199. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/py.typed +0 -0
  200. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/__init__.py +0 -0
  201. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/accounts.py +0 -0
  202. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/artifacts.py +0 -0
  203. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/base.py +0 -0
  204. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/brands.py +0 -0
  205. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/code_changes.py +0 -0
  206. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/conversations.py +0 -0
  207. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/dev_users.py +0 -0
  208. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/engagements.py +0 -0
  209. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/groups.py +0 -0
  210. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/incidents.py +0 -0
  211. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/links.py +0 -0
  212. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/notifications.py +0 -0
  213. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/parts.py +0 -0
  214. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/preferences.py +0 -0
  215. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/question_answers.py +0 -0
  216. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/recommendations.py +0 -0
  217. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/rev_users.py +0 -0
  218. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/search.py +0 -0
  219. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/slas.py +0 -0
  220. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/tags.py +0 -0
  221. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/timeline_entries.py +0 -0
  222. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/track_events.py +0 -0
  223. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/uoms.py +0 -0
  224. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/webhooks.py +0 -0
  225. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/services/works.py +0 -0
  226. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/utils/__init__.py +0 -0
  227. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/utils/content_converter.py +0 -0
  228. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/utils/deprecation.py +0 -0
  229. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/utils/http.py +0 -0
  230. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/utils/logging.py +0 -0
  231. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev/utils/pagination.py +0 -0
  232. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/__init__.py +0 -0
  233. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/__main__.py +0 -0
  234. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/config.py +0 -0
  235. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/middleware/__init__.py +0 -0
  236. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/middleware/audit.py +0 -0
  237. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/middleware/auth.py +0 -0
  238. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/middleware/health.py +0 -0
  239. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/middleware/rate_limit.py +0 -0
  240. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/__init__.py +0 -0
  241. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/escalation.py +0 -0
  242. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/investigate.py +0 -0
  243. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/response.py +0 -0
  244. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/summarize.py +0 -0
  245. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/prompts/triage.py +0 -0
  246. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/__init__.py +0 -0
  247. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/account.py +0 -0
  248. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/article.py +0 -0
  249. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/conversation.py +0 -0
  250. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/part.py +0 -0
  251. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/server_info.py +0 -0
  252. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/ticket.py +0 -0
  253. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/resources/user.py +0 -0
  254. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/server.py +0 -0
  255. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/__init__.py +0 -0
  256. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/accounts.py +0 -0
  257. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/conversations.py +0 -0
  258. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/engagements.py +0 -0
  259. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/groups.py +0 -0
  260. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/incidents.py +0 -0
  261. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/links.py +0 -0
  262. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/parts.py +0 -0
  263. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/recommendations.py +0 -0
  264. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/search.py +0 -0
  265. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/server_info.py +0 -0
  266. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/slas.py +0 -0
  267. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/tags.py +0 -0
  268. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/timeline.py +0 -0
  269. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/users.py +0 -0
  270. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/tools/works.py +0 -0
  271. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/utils/__init__.py +0 -0
  272. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/utils/errors.py +0 -0
  273. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/utils/formatting.py +0 -0
  274. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/src/devrev_mcp/utils/pagination.py +0 -0
  275. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/__init__.py +0 -0
  276. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/conftest.py +0 -0
  277. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/__init__.py +0 -0
  278. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/conftest.py +0 -0
  279. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_accounts_e2e.py +0 -0
  280. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_all_readonly_endpoints.py +0 -0
  281. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_articles_lifecycle.py +0 -0
  282. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_backwards_compatibility.py +0 -0
  283. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_contacts_e2e.py +0 -0
  284. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_core_services_phase1.py +0 -0
  285. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_extended_services_phase2.py +0 -0
  286. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_get_endpoints.py +0 -0
  287. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_issues_e2e.py +0 -0
  288. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_kb_articles_e2e.py +0 -0
  289. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_mcp_articles.py +0 -0
  290. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_ping.py +0 -0
  291. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_question_answers_e2e.py +0 -0
  292. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_readonly_endpoints.py +0 -0
  293. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_specialized_services_phase3.py +0 -0
  294. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_tickets_e2e.py +0 -0
  295. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/test_write_operations.py +0 -0
  296. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/utils/__init__.py +0 -0
  297. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/utils/cleanup.py +0 -0
  298. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/utils/constants.py +0 -0
  299. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/integration/utils/data_manager.py +0 -0
  300. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/performance/__init__.py +0 -0
  301. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/performance/test_articles_performance.py +0 -0
  302. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/__init__.py +0 -0
  303. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/__init__.py +0 -0
  304. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_audit.py +0 -0
  305. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_config.py +0 -0
  306. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_phase4_transport.py +0 -0
  307. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_prompts.py +0 -0
  308. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_resources.py +0 -0
  309. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_server_info.py +0 -0
  310. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_accounts.py +0 -0
  311. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_conversations.py +0 -0
  312. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_engagements.py +0 -0
  313. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_groups.py +0 -0
  314. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_incidents.py +0 -0
  315. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_links.py +0 -0
  316. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_parts.py +0 -0
  317. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_recommendations.py +0 -0
  318. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_search.py +0 -0
  319. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_slas.py +0 -0
  320. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_tags.py +0 -0
  321. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_timeline.py +0 -0
  322. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_users.py +0 -0
  323. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_tools_works.py +0 -0
  324. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/mcp/test_utils.py +0 -0
  325. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/models/__init__.py +0 -0
  326. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/models/test_user_state_regression.py +0 -0
  327. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/__init__.py +0 -0
  328. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/conftest.py +0 -0
  329. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_articles.py +0 -0
  330. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_async_services.py +0 -0
  331. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_brands.py +0 -0
  332. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_code_changes.py +0 -0
  333. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_conversations.py +0 -0
  334. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_engagements.py +0 -0
  335. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_groups.py +0 -0
  336. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_incidents.py +0 -0
  337. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_links.py +0 -0
  338. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_notifications.py +0 -0
  339. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_parts.py +0 -0
  340. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_preferences.py +0 -0
  341. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_question_answers.py +0 -0
  342. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_recommendations.py +0 -0
  343. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_search.py +0 -0
  344. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_slas.py +0 -0
  345. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_tags.py +0 -0
  346. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_timeline_entries.py +0 -0
  347. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_track_events.py +0 -0
  348. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_uoms.py +0 -0
  349. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_webhooks.py +0 -0
  350. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/services/test_works.py +0 -0
  351. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_artifacts.py +0 -0
  352. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_backward_compatibility.py +0 -0
  353. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_base_service.py +0 -0
  354. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_client.py +0 -0
  355. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_config.py +0 -0
  356. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_content_converter.py +0 -0
  357. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_deprecation.py +0 -0
  358. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_error_handling.py +0 -0
  359. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_exceptions.py +0 -0
  360. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_http.py +0 -0
  361. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_logging.py +0 -0
  362. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/tests/unit/test_pagination.py +0 -0
  363. {devrev_python_sdk-2.8.1 → devrev_python_sdk-2.9.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devrev-Python-SDK
3
- Version: 2.8.1
3
+ Version: 2.9.0
4
4
  Summary: A modern, type-safe Python SDK for the DevRev API
5
5
  Project-URL: Homepage, https://github.com/mgmonteleone/py-dev-rev
6
6
  Project-URL: Documentation, https://github.com/mgmonteleone/py-dev-rev
@@ -517,6 +517,7 @@ article = client.articles.create_with_content(
517
517
  owned_by=["don:identity:dvrv-us-1:devo/1:devu/1"],
518
518
  description="Quick start guide for new users", # Optional metadata
519
519
  status=ArticleStatus.PUBLISHED,
520
+ applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123"], # Optional: associate with parts
520
521
  )
521
522
 
522
523
  # Get article with content
@@ -538,6 +539,12 @@ client.articles.update_with_content(
538
539
  status=ArticleStatus.ARCHIVED,
539
540
  )
540
541
 
542
+ # Update with part associations
543
+ client.articles.update_with_content(
544
+ id=article.id,
545
+ applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123", "don:core:dvrv-us-1:devo/1:part/456"],
546
+ )
547
+
541
548
  # List published articles (metadata only)
542
549
  published = client.articles.list(limit=20)
543
550
  for article in published:
@@ -442,6 +442,7 @@ article = client.articles.create_with_content(
442
442
  owned_by=["don:identity:dvrv-us-1:devo/1:devu/1"],
443
443
  description="Quick start guide for new users", # Optional metadata
444
444
  status=ArticleStatus.PUBLISHED,
445
+ applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123"], # Optional: associate with parts
445
446
  )
446
447
 
447
448
  # Get article with content
@@ -463,6 +464,12 @@ client.articles.update_with_content(
463
464
  status=ArticleStatus.ARCHIVED,
464
465
  )
465
466
 
467
+ # Update with part associations
468
+ client.articles.update_with_content(
469
+ id=article.id,
470
+ applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123", "don:core:dvrv-us-1:devo/1:part/456"],
471
+ )
472
+
466
473
  # List published articles (metadata only)
467
474
  published = client.articles.list(limit=20)
468
475
  for article in published:
@@ -93,6 +93,7 @@ article = client.articles.create_with_content(
93
93
  description="Short summary for search/listing", # Optional metadata
94
94
  status=ArticleStatus.PUBLISHED, # Optional: draft, published, archived
95
95
  content_format="text/html", # Optional: default is text/html
96
+ applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123"], # Optional: associate with parts
96
97
  )
97
98
  print(f"Created article with content: {article.id}")
98
99
  ```
@@ -181,6 +182,12 @@ updated_article = client.articles.update_with_content(
181
182
  id="don:core:dvrv-us-1:devo/1:article/123",
182
183
  content="<h1>New Content</h1>",
183
184
  )
185
+
186
+ # Update with part associations
187
+ updated_article = client.articles.update_with_content(
188
+ id="don:core:dvrv-us-1:devo/1:article/123",
189
+ applies_to_parts=["don:core:dvrv-us-1:devo/1:part/123", "don:core:dvrv-us-1:devo/1:part/456"],
190
+ )
184
191
  ```
185
192
 
186
193
  ### Async Usage
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.9.0] - 2026-03-09
11
+
12
+ ### Added
13
+
14
+ - **Article Part Association** (#171) — Added `applies_to_parts` parameter to MCP `articles_create` and `articles_update` tools, and SDK `update_with_content` method for native article-to-part association
15
+
10
16
  ## [2.8.1] - 2026-03-06
11
17
 
12
18
  ### Fixed
@@ -56,6 +56,7 @@ Tools are the primary way AI assistants interact with DevRev. Each tool maps to
56
56
  - **Unified Content Management**: Create and update articles with automatic artifact handling
57
57
  - **Optional Content Loading**: Use `include_content=true` in `get` to fetch article body
58
58
  - **Clear Parameters**: `content` for article body, `description` for metadata summary
59
+ - **Part Association**: Use `applies_to_parts` to natively associate articles with products, capabilities, features, or enhancements
59
60
 
60
61
  ### Conversations
61
62
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "devrev-Python-SDK"
7
- version = "2.8.1"
7
+ version = "2.9.0"
8
8
  description = "A modern, type-safe Python SDK for the DevRev API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -21,6 +21,7 @@ from devrev.models.articles import (
21
21
  ArticlesListResponse,
22
22
  ArticleStatus,
23
23
  ArticlesUpdateRequest,
24
+ ArticlesUpdateRequestAppliesToParts,
24
25
  ArticlesUpdateResponse,
25
26
  ArticleType,
26
27
  ArticleWithContent,
@@ -437,6 +438,7 @@ class ArticlesService(BaseService):
437
438
  content: str | None = None,
438
439
  description: str | None = None,
439
440
  status: ArticleStatus | None = None,
441
+ applies_to_parts: builtins.list[str] | None = None,
440
442
  ) -> Article:
441
443
  """Update article metadata and/or content.
442
444
 
@@ -451,6 +453,7 @@ class ArticlesService(BaseService):
451
453
  content: Optional new article body content
452
454
  description: Optional new metadata description
453
455
  status: Optional new status
456
+ applies_to_parts: Optional list of part IDs to associate with
454
457
 
455
458
  Returns:
456
459
  Updated article
@@ -478,6 +481,12 @@ class ArticlesService(BaseService):
478
481
  ... title="New Title",
479
482
  ... content="<html>New content...</html>"
480
483
  ... )
484
+ >>>
485
+ >>> # Update applies_to_parts
486
+ >>> article = client.articles.update_with_content(
487
+ ... "ART-123",
488
+ ... applies_to_parts=["don:core:...:capability/6"]
489
+ ... )
481
490
  """
482
491
  if not self._parent_client:
483
492
  raise DevRevError(
@@ -489,13 +498,25 @@ class ArticlesService(BaseService):
489
498
  if content is not None:
490
499
  self.update_content(id, content)
491
500
 
501
+ # Build applies_to_parts wrapper if provided
502
+ applies_to_parts_req = None
503
+ if applies_to_parts is not None:
504
+ applies_to_parts_req = ArticlesUpdateRequestAppliesToParts(set=applies_to_parts)
505
+
492
506
  # Update metadata if any metadata fields provided
493
- if title is not None or description is not None or status is not None:
507
+ has_metadata = (
508
+ title is not None
509
+ or description is not None
510
+ or status is not None
511
+ or applies_to_parts is not None
512
+ )
513
+ if has_metadata:
494
514
  update_req = ArticlesUpdateRequest(
495
515
  id=id,
496
516
  title=title,
497
517
  description=description,
498
518
  status=status,
519
+ applies_to_parts=applies_to_parts_req,
499
520
  )
500
521
  return self.update(update_req)
501
522
 
@@ -822,6 +843,7 @@ class AsyncArticlesService(AsyncBaseService):
822
843
  content: str | None = None,
823
844
  description: str | None = None,
824
845
  status: ArticleStatus | None = None,
846
+ applies_to_parts: builtins.list[str] | None = None,
825
847
  ) -> Article:
826
848
  """Update article metadata and/or content (async).
827
849
 
@@ -836,6 +858,7 @@ class AsyncArticlesService(AsyncBaseService):
836
858
  content: Optional new article body content
837
859
  description: Optional new metadata description
838
860
  status: Optional new status
861
+ applies_to_parts: Optional list of part IDs to associate with
839
862
 
840
863
  Returns:
841
864
  Updated article
@@ -853,13 +876,25 @@ class AsyncArticlesService(AsyncBaseService):
853
876
  if content is not None:
854
877
  await self.update_content(id, content)
855
878
 
879
+ # Build applies_to_parts wrapper if provided
880
+ applies_to_parts_req = None
881
+ if applies_to_parts is not None:
882
+ applies_to_parts_req = ArticlesUpdateRequestAppliesToParts(set=applies_to_parts)
883
+
856
884
  # Update metadata if any metadata fields provided
857
- if title is not None or description is not None or status is not None:
885
+ has_metadata = (
886
+ title is not None
887
+ or description is not None
888
+ or status is not None
889
+ or applies_to_parts is not None
890
+ )
891
+ if has_metadata:
858
892
  update_req = ArticlesUpdateRequest(
859
893
  id=id,
860
894
  title=title,
861
895
  description=description,
862
896
  status=status,
897
+ applies_to_parts=applies_to_parts_req,
863
898
  )
864
899
  return await self.update(update_req)
865
900
 
@@ -102,6 +102,7 @@ if _config.enable_destructive_tools:
102
102
  description: str | None = None,
103
103
  status: str | None = None,
104
104
  content_format: str = "text/html",
105
+ applies_to_parts: list[str] | None = None,
105
106
  ) -> dict[str, Any]:
106
107
  """Create a new article with content.
107
108
 
@@ -113,6 +114,8 @@ if _config.enable_destructive_tools:
113
114
  description: Optional short metadata description (NOT the article body).
114
115
  status: Optional article status (draft, published, archived).
115
116
  content_format: Content MIME type (default: text/html).
117
+ applies_to_parts: Optional list of part IDs (products, capabilities,
118
+ features, enhancements) to associate the article with.
116
119
 
117
120
  Returns:
118
121
  Dictionary containing the created article details.
@@ -139,6 +142,7 @@ if _config.enable_destructive_tools:
139
142
  description=description,
140
143
  status=article_status,
141
144
  content_format=content_format,
145
+ applies_to_parts=applies_to_parts,
142
146
  )
143
147
  return serialize_model(article)
144
148
  except DevRevError as e:
@@ -152,6 +156,7 @@ if _config.enable_destructive_tools:
152
156
  content: str | None = None,
153
157
  description: str | None = None,
154
158
  status: str | None = None,
159
+ applies_to_parts: list[str] | None = None,
155
160
  ) -> dict[str, Any]:
156
161
  """Update an existing article in DevRev.
157
162
 
@@ -162,6 +167,9 @@ if _config.enable_destructive_tools:
162
167
  content: Optional new article body content.
163
168
  description: Optional new metadata description (NOT the article body).
164
169
  status: Optional new status (draft, published, archived).
170
+ applies_to_parts: Optional list of part IDs (products, capabilities,
171
+ features, enhancements) to associate the article with.
172
+ Pass an empty list to remove all associations.
165
173
 
166
174
  Returns:
167
175
  Dictionary containing the updated article details.
@@ -187,6 +195,7 @@ if _config.enable_destructive_tools:
187
195
  content=content,
188
196
  description=description,
189
197
  status=article_status,
198
+ applies_to_parts=applies_to_parts,
190
199
  )
191
200
  return serialize_model(article)
192
201
  except DevRevError as e:
@@ -110,7 +110,9 @@ def mock_client():
110
110
  client.articles.list = AsyncMock()
111
111
  client.articles.get = AsyncMock()
112
112
  client.articles.create = AsyncMock()
113
+ client.articles.create_with_content = AsyncMock()
113
114
  client.articles.update = AsyncMock()
115
+ client.articles.update_with_content = AsyncMock()
114
116
  client.articles.delete = AsyncMock()
115
117
  client.articles.count = AsyncMock()
116
118
 
@@ -154,6 +154,34 @@ class TestArticlesCreateTool:
154
154
  owned_by=["don:identity:dvrv-us-1:devo/test:devu/1"],
155
155
  )
156
156
 
157
+ @pytest.mark.asyncio
158
+ async def test_create_with_applies_to_parts(self, mock_ctx, mock_client):
159
+ """Test creating an article with applies_to_parts."""
160
+ mock_article = _make_mock_article(
161
+ title="Article with Parts",
162
+ description="Content with parts",
163
+ )
164
+ mock_client.articles.create_with_content.return_value = mock_article
165
+
166
+ result = await devrev_articles_create(
167
+ mock_ctx,
168
+ title="Article with Parts",
169
+ content="Content with parts",
170
+ owned_by=["don:identity:dvrv-us-1:devo/test:devu/1"],
171
+ applies_to_parts=[
172
+ "don:core:dvrv-us-1:devo/1:product/1",
173
+ "don:core:dvrv-us-1:devo/1:capability/2",
174
+ ],
175
+ )
176
+
177
+ assert result["title"] == "Article with Parts"
178
+ # Verify applies_to_parts was passed to SDK
179
+ call_args = mock_client.articles.create_with_content.call_args
180
+ assert call_args[1]["applies_to_parts"] == [
181
+ "don:core:dvrv-us-1:devo/1:product/1",
182
+ "don:core:dvrv-us-1:devo/1:capability/2",
183
+ ]
184
+
157
185
 
158
186
  class TestArticlesUpdateTool:
159
187
  """Tests for devrev_articles_update tool."""
@@ -186,6 +214,28 @@ class TestArticlesUpdateTool:
186
214
  with pytest.raises(RuntimeError, match="Article not found"):
187
215
  await devrev_articles_update(mock_ctx, id="nonexistent", title="New")
188
216
 
217
+ @pytest.mark.asyncio
218
+ async def test_update_with_applies_to_parts(self, mock_ctx, mock_client):
219
+ """Test updating an article with applies_to_parts."""
220
+ mock_article = _make_mock_article(
221
+ id="article-1",
222
+ title="Updated Article",
223
+ status="published",
224
+ )
225
+ mock_client.articles.update_with_content.return_value = mock_article
226
+
227
+ result = await devrev_articles_update(
228
+ mock_ctx,
229
+ id="article-1",
230
+ title="Updated Article",
231
+ applies_to_parts=["don:core:dvrv-us-1:devo/1:feature/3"],
232
+ )
233
+
234
+ assert result["title"] == "Updated Article"
235
+ # Verify applies_to_parts was passed to SDK
236
+ call_args = mock_client.articles.update_with_content.call_args
237
+ assert call_args[1]["applies_to_parts"] == ["don:core:dvrv-us-1:devo/1:feature/3"]
238
+
189
239
 
190
240
  class TestArticlesDeleteTool:
191
241
  """Tests for devrev_articles_delete tool."""
@@ -776,6 +776,86 @@ class TestUpdateWithContent:
776
776
  with pytest.raises(DevRevError, match="update_with_content requires parent client"):
777
777
  articles_service_no_parent.update_with_content("article-123", title="New")
778
778
 
779
+ def test_update_with_content_applies_to_parts_only(
780
+ self,
781
+ articles_service: ArticlesService,
782
+ mock_article: Article,
783
+ mock_http_client: MagicMock,
784
+ ) -> None:
785
+ """Test updating only applies_to_parts."""
786
+ mock_response = MagicMock()
787
+ mock_response.json.return_value = {"article": mock_article.model_dump(mode="json")}
788
+ mock_http_client.post.return_value = mock_response
789
+
790
+ result = articles_service.update_with_content(
791
+ "article-123",
792
+ applies_to_parts=["don:core:dvrv-us-1:devo/1:product/1"],
793
+ )
794
+
795
+ assert result.id == "article-123"
796
+ # Verify update was called with applies_to_parts wrapped in set
797
+ post_call = mock_http_client.post.call_args
798
+ assert "articles.update" in post_call[0][0]
799
+ data = post_call[1]["data"]
800
+ assert "applies_to_parts" in data
801
+ assert data["applies_to_parts"]["set"] == ["don:core:dvrv-us-1:devo/1:product/1"]
802
+
803
+ def test_update_with_content_applies_to_parts_with_metadata(
804
+ self,
805
+ articles_service: ArticlesService,
806
+ mock_article: Article,
807
+ mock_http_client: MagicMock,
808
+ ) -> None:
809
+ """Test updating applies_to_parts along with other metadata."""
810
+ mock_response = MagicMock()
811
+ mock_response.json.return_value = {"article": mock_article.model_dump(mode="json")}
812
+ mock_http_client.post.return_value = mock_response
813
+
814
+ result = articles_service.update_with_content(
815
+ "article-123",
816
+ title="New Title",
817
+ description="New description",
818
+ applies_to_parts=[
819
+ "don:core:dvrv-us-1:devo/1:capability/2",
820
+ "don:core:dvrv-us-1:devo/1:feature/3",
821
+ ],
822
+ )
823
+
824
+ assert result.id == "article-123"
825
+ # Verify all metadata was passed including applies_to_parts
826
+ post_call = mock_http_client.post.call_args
827
+ data = post_call[1]["data"]
828
+ assert data["title"] == "New Title"
829
+ assert data["description"] == "New description"
830
+ assert "applies_to_parts" in data
831
+ assert data["applies_to_parts"]["set"] == [
832
+ "don:core:dvrv-us-1:devo/1:capability/2",
833
+ "don:core:dvrv-us-1:devo/1:feature/3",
834
+ ]
835
+
836
+ def test_update_with_content_applies_to_parts_empty_list(
837
+ self,
838
+ articles_service: ArticlesService,
839
+ mock_article: Article,
840
+ mock_http_client: MagicMock,
841
+ ) -> None:
842
+ """Test updating with empty applies_to_parts list to remove all associations."""
843
+ mock_response = MagicMock()
844
+ mock_response.json.return_value = {"article": mock_article.model_dump(mode="json")}
845
+ mock_http_client.post.return_value = mock_response
846
+
847
+ result = articles_service.update_with_content(
848
+ "article-123",
849
+ applies_to_parts=[],
850
+ )
851
+
852
+ assert result.id == "article-123"
853
+ # Verify empty list is passed to clear associations
854
+ post_call = mock_http_client.post.call_args
855
+ data = post_call[1]["data"]
856
+ assert "applies_to_parts" in data
857
+ assert data["applies_to_parts"]["set"] == []
858
+
779
859
 
780
860
  # ============================================================================
781
861
  # Async Tests
@@ -1363,3 +1443,86 @@ class TestUpdateWithContentAsync:
1363
1443
  "article-123",
1364
1444
  title="New",
1365
1445
  )
1446
+
1447
+ @pytest.mark.asyncio
1448
+ async def test_async_update_with_content_applies_to_parts_only(
1449
+ self,
1450
+ async_articles_service: AsyncArticlesService,
1451
+ mock_article: Article,
1452
+ mock_async_http_client: MagicMock,
1453
+ ) -> None:
1454
+ """Test async updating only applies_to_parts."""
1455
+ mock_response = MagicMock()
1456
+ mock_response.json.return_value = {"article": mock_article.model_dump(mode="json")}
1457
+ mock_async_http_client.post.return_value = mock_response
1458
+
1459
+ result = await async_articles_service.update_with_content(
1460
+ "article-123",
1461
+ applies_to_parts=["don:core:dvrv-us-1:devo/1:product/1"],
1462
+ )
1463
+
1464
+ assert result.id == "article-123"
1465
+ # Verify update was called with applies_to_parts wrapped in set
1466
+ post_call = mock_async_http_client.post.call_args
1467
+ assert "articles.update" in post_call[0][0]
1468
+ data = post_call[1]["data"]
1469
+ assert "applies_to_parts" in data
1470
+ assert data["applies_to_parts"]["set"] == ["don:core:dvrv-us-1:devo/1:product/1"]
1471
+
1472
+ @pytest.mark.asyncio
1473
+ async def test_async_update_with_content_applies_to_parts_with_metadata(
1474
+ self,
1475
+ async_articles_service: AsyncArticlesService,
1476
+ mock_article: Article,
1477
+ mock_async_http_client: MagicMock,
1478
+ ) -> None:
1479
+ """Test async updating applies_to_parts along with other metadata."""
1480
+ mock_response = MagicMock()
1481
+ mock_response.json.return_value = {"article": mock_article.model_dump(mode="json")}
1482
+ mock_async_http_client.post.return_value = mock_response
1483
+
1484
+ result = await async_articles_service.update_with_content(
1485
+ "article-123",
1486
+ title="New Title",
1487
+ description="New description",
1488
+ applies_to_parts=[
1489
+ "don:core:dvrv-us-1:devo/1:capability/2",
1490
+ "don:core:dvrv-us-1:devo/1:feature/3",
1491
+ ],
1492
+ )
1493
+
1494
+ assert result.id == "article-123"
1495
+ # Verify all metadata was passed including applies_to_parts
1496
+ post_call = mock_async_http_client.post.call_args
1497
+ data = post_call[1]["data"]
1498
+ assert data["title"] == "New Title"
1499
+ assert data["description"] == "New description"
1500
+ assert "applies_to_parts" in data
1501
+ assert data["applies_to_parts"]["set"] == [
1502
+ "don:core:dvrv-us-1:devo/1:capability/2",
1503
+ "don:core:dvrv-us-1:devo/1:feature/3",
1504
+ ]
1505
+
1506
+ @pytest.mark.asyncio
1507
+ async def test_async_update_with_content_applies_to_parts_empty_list(
1508
+ self,
1509
+ async_articles_service: AsyncArticlesService,
1510
+ mock_article: Article,
1511
+ mock_async_http_client: MagicMock,
1512
+ ) -> None:
1513
+ """Test async updating with empty applies_to_parts list to remove all associations."""
1514
+ mock_response = MagicMock()
1515
+ mock_response.json.return_value = {"article": mock_article.model_dump(mode="json")}
1516
+ mock_async_http_client.post.return_value = mock_response
1517
+
1518
+ result = await async_articles_service.update_with_content(
1519
+ "article-123",
1520
+ applies_to_parts=[],
1521
+ )
1522
+
1523
+ assert result.id == "article-123"
1524
+ # Verify empty list is passed to clear associations
1525
+ post_call = mock_async_http_client.post.call_args
1526
+ data = post_call[1]["data"]
1527
+ assert "applies_to_parts" in data
1528
+ assert data["applies_to_parts"]["set"] == []