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