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

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