glpi-python-client 0.5.0__tar.gz → 0.6.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 (171) hide show
  1. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/.gitignore +1 -1
  2. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/CHANGELOG.md +217 -0
  3. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/CONTRIBUTING.md +17 -1
  4. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/PKG-INFO +9 -10
  5. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/README.md +1 -1
  6. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/api_reference.rst +137 -10
  7. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/conf.py +1 -5
  8. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/development.md +7 -3
  9. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/installation.rst +7 -2
  10. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/publishing_rtd.rst +1 -1
  11. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/user_guide.rst +461 -13
  12. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/__init__.py +43 -1
  13. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/auth/_v1_session.py +3 -3
  14. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/auth/auth.py +3 -3
  15. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/_base_client.py +1 -7
  16. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/__init__.py +13 -3
  17. glpi_python_client-0.6.1/glpi_python_client/_async/clients/api/assets/__init__.py +7 -0
  18. glpi_python_client-0.6.1/glpi_python_client/_async/clients/api/assets/_computer.py +427 -0
  19. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/dropdowns/__init__.py +4 -1
  20. glpi_python_client-0.6.1/glpi_python_client/_async/clients/api/dropdowns/_contract_type.py +220 -0
  21. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/management/__init__.py +2 -1
  22. glpi_python_client-0.6.1/glpi_python_client/_async/clients/api/management/_contract.py +411 -0
  23. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/client.py +7 -6
  24. {glpi_python_client-0.5.0/glpi_python_client/_sync → glpi_python_client-0.6.1/glpi_python_client/_async}/clients/commons/_constants.py +9 -1
  25. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_errors.py +2 -2
  26. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/auth/_v1_session.py +3 -3
  27. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/auth/auth.py +3 -3
  28. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/_base_client.py +1 -7
  29. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/__init__.py +13 -3
  30. glpi_python_client-0.6.1/glpi_python_client/_sync/clients/api/assets/__init__.py +7 -0
  31. glpi_python_client-0.6.1/glpi_python_client/_sync/clients/api/assets/_computer.py +427 -0
  32. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/dropdowns/__init__.py +4 -1
  33. glpi_python_client-0.6.1/glpi_python_client/_sync/clients/api/dropdowns/_contract_type.py +220 -0
  34. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/management/__init__.py +2 -1
  35. glpi_python_client-0.6.1/glpi_python_client/_sync/clients/api/management/_contract.py +411 -0
  36. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/client.py +7 -6
  37. {glpi_python_client-0.5.0/glpi_python_client/_async → glpi_python_client-0.6.1/glpi_python_client/_sync}/clients/commons/_constants.py +9 -1
  38. glpi_python_client-0.6.1/glpi_python_client/content/conversion.py +832 -0
  39. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/__init__.py +45 -1
  40. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/__init__.py +1 -1
  41. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/_content.py +21 -11
  42. glpi_python_client-0.6.1/glpi_python_client/models/api_schema/assets/__init__.py +25 -0
  43. glpi_python_client-0.6.1/glpi_python_client/models/api_schema/assets/_computer.py +257 -0
  44. glpi_python_client-0.6.1/glpi_python_client/models/api_schema/assets/_contract_item.py +102 -0
  45. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/dropdowns/__init__.py +10 -0
  46. glpi_python_client-0.6.1/glpi_python_client/models/api_schema/dropdowns/_contract_type.py +100 -0
  47. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/enums.py +14 -0
  48. glpi_python_client-0.6.1/glpi_python_client/models/api_schema/management/__init__.py +35 -0
  49. glpi_python_client-0.6.1/glpi_python_client/models/api_schema/management/_contract.py +328 -0
  50. glpi_python_client-0.6.1/glpi_python_client/models/api_schema/management/_contract_cost.py +139 -0
  51. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/custom_schema/_ticket_context.py +18 -6
  52. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/pyproject.toml +31 -12
  53. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/README.md +3 -1
  54. glpi_python_client-0.6.1/skills/glpi-asset-workflow/SKILL.md +89 -0
  55. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-client-setup/SKILL.md +2 -2
  56. glpi_python_client-0.6.1/skills/glpi-contract-workflow/SKILL.md +123 -0
  57. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-document-workflow/SKILL.md +2 -2
  58. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-knowledge-base/SKILL.md +3 -3
  59. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-plugin-fields/SKILL.md +3 -3
  60. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-reporting-and-context/SKILL.md +2 -2
  61. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-team-members/SKILL.md +2 -2
  62. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-ticket-timeline/SKILL.md +4 -3
  63. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-ticket-workflow/SKILL.md +4 -3
  64. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-user-location-provisioning/SKILL.md +2 -2
  65. glpi_python_client-0.5.0/glpi_python_client/content/conversion.py +0 -729
  66. glpi_python_client-0.5.0/glpi_python_client/models/api_schema/management/__init__.py +0 -15
  67. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/.pre-commit-config.yaml +0 -0
  68. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/.readthedocs.yaml +0 -0
  69. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/LICENSE +0 -0
  70. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/_static/.gitkeep +0 -0
  71. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/development_rtd.rst +0 -0
  72. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/index.rst +0 -0
  73. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/publishing.md +0 -0
  74. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/sponsoring.rst +0 -0
  75. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/__init__.py +0 -0
  76. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/_concurrency.py +0 -0
  77. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/_testing.py +0 -0
  78. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/auth/__init__.py +0 -0
  79. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/__init__.py +0 -0
  80. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/administration/__init__.py +0 -0
  81. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/administration/_entity.py +0 -0
  82. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/administration/_user.py +0 -0
  83. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/__init__.py +0 -0
  84. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/_team.py +0 -0
  85. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/_ticket.py +0 -0
  86. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/timeline/__init__.py +0 -0
  87. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/timeline/_document.py +0 -0
  88. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/timeline/_followup.py +0 -0
  89. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/timeline/_solution.py +0 -0
  90. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/timeline/_task.py +0 -0
  91. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/dropdowns/_location.py +0 -0
  92. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/knowledgebase/__init__.py +0 -0
  93. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/knowledgebase/_article.py +0 -0
  94. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/knowledgebase/_category.py +0 -0
  95. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/knowledgebase/_comment.py +0 -0
  96. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/knowledgebase/_revision.py +0 -0
  97. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/management/_document.py +0 -0
  98. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/plugins/__init__.py +0 -0
  99. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/plugins/_fields.py +0 -0
  100. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/commons/__init__.py +0 -0
  101. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/commons/_config.py +0 -0
  102. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/commons/_filters.py +0 -0
  103. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/commons/_http.py +0 -0
  104. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/commons/_payloads.py +0 -0
  105. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/commons/_transport.py +0 -0
  106. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/custom/__init__.py +0 -0
  107. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/custom/_statistics.py +0 -0
  108. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/custom/_ticket_context.py +0 -0
  109. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/__init__.py +0 -0
  110. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/_concurrency.py +0 -0
  111. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/_testing.py +0 -0
  112. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/auth/__init__.py +0 -0
  113. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/__init__.py +0 -0
  114. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/administration/__init__.py +0 -0
  115. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/administration/_entity.py +0 -0
  116. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/administration/_user.py +0 -0
  117. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/__init__.py +0 -0
  118. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/_team.py +0 -0
  119. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/_ticket.py +0 -0
  120. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/timeline/__init__.py +0 -0
  121. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/timeline/_document.py +0 -0
  122. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/timeline/_followup.py +0 -0
  123. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/timeline/_solution.py +0 -0
  124. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/timeline/_task.py +0 -0
  125. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/dropdowns/_location.py +0 -0
  126. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/knowledgebase/__init__.py +0 -0
  127. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/knowledgebase/_article.py +0 -0
  128. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/knowledgebase/_category.py +0 -0
  129. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/knowledgebase/_comment.py +0 -0
  130. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/knowledgebase/_revision.py +0 -0
  131. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/management/_document.py +0 -0
  132. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/plugins/__init__.py +0 -0
  133. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/plugins/_fields.py +0 -0
  134. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/commons/__init__.py +0 -0
  135. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/commons/_config.py +0 -0
  136. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/commons/_filters.py +0 -0
  137. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/commons/_http.py +0 -0
  138. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/commons/_payloads.py +0 -0
  139. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/commons/_transport.py +0 -0
  140. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/custom/__init__.py +0 -0
  141. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/custom/_statistics.py +0 -0
  142. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/custom/_ticket_context.py +0 -0
  143. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/content/__init__.py +0 -0
  144. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/_base.py +0 -0
  145. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/_common.py +0 -0
  146. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/administration/__init__.py +0 -0
  147. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/administration/_entity.py +0 -0
  148. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/administration/_user.py +0 -0
  149. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/__init__.py +0 -0
  150. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/_team.py +0 -0
  151. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/_ticket.py +0 -0
  152. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/timeline/__init__.py +0 -0
  153. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/timeline/_document.py +0 -0
  154. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/timeline/_followup.py +0 -0
  155. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/timeline/_solution.py +0 -0
  156. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/timeline/_task.py +0 -0
  157. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/dropdowns/_location.py +0 -0
  158. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/knowledgebase/__init__.py +0 -0
  159. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/knowledgebase/_article.py +0 -0
  160. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/knowledgebase/_category.py +0 -0
  161. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/knowledgebase/_comment.py +0 -0
  162. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/knowledgebase/_revision.py +0 -0
  163. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/management/_document.py +0 -0
  164. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/plugins/__init__.py +0 -0
  165. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/plugins/_fields.py +0 -0
  166. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/custom_schema/__init__.py +0 -0
  167. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/py.typed +0 -0
  168. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/rsql.py +0 -0
  169. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/testing/__init__.py +0 -0
  170. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/testing/fixtures.py +0 -0
  171. {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/testing/utils.py +0 -0
@@ -33,7 +33,7 @@ CLAUDE.md
33
33
  docs/superpowers/*
34
34
 
35
35
  # Large generated GLPI API contract (kept locally, not tracked)
36
- docs/glpi_api_contract.json
36
+ docs/api_contract/
37
37
  # Coverage data: rewritten by every test run (and by the venv .pth hook).
38
38
  .coverage
39
39
  .coverage.*
@@ -4,6 +4,223 @@ All notable changes to this project are documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
+ ## 0.6.1 — 2026-10-02
8
+
9
+ The reader now gives the same Markdown as `easyvista-python-client` 0.4.1,
10
+ whose converter is this package's 0.6.0 converter plus fifteen fixes and a
11
+ correction to one of them. This release ports those fixes and the
12
+ correction, with their tests. The two conversion modules now differ only in
13
+ names, error messages, docstrings and that package's optional-dependency
14
+ import guard. The converter's writing (`to_transport`) is unchanged; a
15
+ write model now sends a lone surrogate as U+FFFD.
16
+
17
+ ### Fixed
18
+
19
+ - **Image alt text lost its escapes**: `a_b_c.png` read back as `abc.png`.
20
+ Escapes and character references in alt text are kept.
21
+ - **A line opening with `~~~` became a code fence** that swallowed the rest
22
+ of the body. It reads as `\~~~`.
23
+ - **A `!` right before a link turned the link into an image**
24
+ (`Attention!` then a link). It reads as `\!`.
25
+ - **An image whose alt text starts with `^` stopped being an image** once
26
+ rendered, since cmark-gfm never opens one on `![^`. The `^` is escaped.
27
+ - **`<<a@example.org>` became an autolink** behind an escaped `<`. The second
28
+ `<` is escaped too.
29
+ - **A line break inside inline code showed as a literal backslash.**
30
+ `<code>`, `<kbd>` and `<samp>` holding a `<br>` become one span per line;
31
+ a `|` in `<kbd>` or `<samp>` in a table cell no longer splits the row.
32
+ - **A table inside a heading or a link showed its pipes as text**, and
33
+ inside a link did not read back as itself. It is written as its cells'
34
+ text, as a table inside a cell already was.
35
+ - **A block inside such a flattened table broke its holder's line.** It
36
+ stays on that line.
37
+ - **Bold ending in punctuation at a flattened cell's edge came back as raw
38
+ `<strong>`**, which read back as `**`. It stays Markdown bold.
39
+ - **Two `<center>` blocks ran together.** `<center>` is a block, as `<div>`
40
+ is, except inside `<pre>`.
41
+ - **Underline, highlight and inserted text lost their formatting.** `<u>`,
42
+ `<mark>` and `<ins>` are kept as raw tags, as `<s>` already was. Round a
43
+ block (a table, a list, a heading, a quote, a code block, a rule or
44
+ paragraphs) the tag is dropped and the blocks read as 0.6.0 read them.
45
+ Markdown has no inline tag round blocks: `easyvista-python-client` 0.4.0,
46
+ which kept it, showed a table as pipe text and a list or a heading as its
47
+ Markdown source, and round a `<pre>` left a fence open to the end of the
48
+ body. Inside a table cell or a heading, whose blocks are one line, the tag
49
+ stays.
50
+ - **A long ordered list was quadratic to read**: 5,000 items took 3.1 s,
51
+ and take 0.6 s now (CPython 3.12.3). An `<ol start>` such as `²` or `½`
52
+ counts from 1, as a browser counts a start holding no digit, instead of
53
+ failing the body.
54
+ - **A run of spaces or line breaks at the edge of bold, italic or a link was
55
+ quadratic to read.** It is linear.
56
+ - **A `colspan` or `start` markdownify cannot read as a number raised
57
+ `GlpiContentError`** from `.content` (`colspan="²"`, or 5,000 digits). The
58
+ body degrades to its text instead, every word kept. Any other
59
+ `ValueError` raised while converting takes the same path.
60
+ - **A lone surrogate in a write model's Markdown failed the whole write**
61
+ with `GlpiContentError`: cmark-gfm renders UTF-8, which cannot encode
62
+ one. Each lone surrogate is written as U+FFFD instead, as CommonMark
63
+ replaces a NUL, and the rest of the body keeps its Markdown. Calling
64
+ `GlpiContentConverter.to_transport` directly still raises, as
65
+ `easyvista-python-client`'s converter does.
66
+ - **A run of unfinished tags at the end of a body was quadratic to read** on
67
+ CPython before 3.11.14, 3.12.12 and 3.13.6 (CVE-2025-6069). Every `<`
68
+ after the body's last `>` is read as text, so `x <a b` at the very end
69
+ reads as `x \<a b` on every interpreter, where a patched one dropped it.
70
+
71
+ ### Changed
72
+
73
+ - **`.content` changes once** for a body holding any shape above, so stored
74
+ digests of such bodies change once.
75
+ - **Deeply nested HTML degrades to text sooner.** The reader spends one more
76
+ stack frame per level: from a shallow stack, the deepest `<div>` document
77
+ read with its structure went from about 490 levels to about 326 (CPython
78
+ 3.12.3 and 3.13.14, default recursion limit). `<blockquote>` stays at
79
+ about 194. The words are kept either way.
80
+ - **Dependency bounds** are now those of `easyvista-python-client[content]`
81
+ 0.4.0, so the two packages resolve to the same libraries side by side:
82
+ `markdown-it-py>=3.0,<4` (the alt-text fix relies on 3.x's `text_special`
83
+ tokens, and `mdformat` 0.7.22 requires `<4` anyway),
84
+ `markdownify>=1.2.3,<1.3` and `mdformat-tables>=1.0,<1.1`.
85
+ `mdformat>=0.7.22,<0.8` is unchanged. The reader overrides private
86
+ surfaces of `markdownify` and `mdformat`; `pyproject.toml` gives the
87
+ reason for each bound.
88
+
89
+ ### Documentation
90
+
91
+ - The user guide's rich-text section now says what each element becomes,
92
+ that neither direction sanitises, what survives a round trip, and the
93
+ known holes, all reproduced on 2026-10-02. Its claim that a read always
94
+ displays the same and reads back as itself is now stated as the aim it
95
+ is, as in the API reference and the module docstring.
96
+ - The deep-nesting note gives the measured depths, and that a read started
97
+ within about 30 frames of the recursion limit can still raise.
98
+ - `GlpiContentError`'s docstring named python-markdown as the writer; it is
99
+ cmark-gfm.
100
+ - The `glpi-ticket-timeline`, `glpi-ticket-workflow` and
101
+ `glpi-knowledge-base` skills describe raw `<u>`, `<mark>`, `<ins>` and
102
+ `<s>`, the write-model rule exactly, and the new depth.
103
+ - Corrected after review: a write model keeps the caller's Markdown
104
+ stripped at both ends, not verbatim; the `glpi-knowledge-base` and
105
+ `glpi-plugin-fields` skills no longer say a deep body never raises; any
106
+ `ValueError` degrades to text, not only a `colspan` or `start`; a
107
+ `start` counts as a browser counts it only when it holds no digit; and
108
+ the CVE-2025-6069 note says that everything after a body's last `>`,
109
+ an unterminated comment or a cut-short closing tag included, is shown.
110
+
111
+ ### Tests
112
+
113
+ - `content/tests/test_fixes.py` pins each of the fifteen fixes; run against
114
+ 0.6.0, 36 of the 54 tests first ported fail on CPython 3.12.3 and 37 on
115
+ 3.13.14, the rest being controls and pins. Section 11 also pins the
116
+ correction to fix 11 with 42 tests, 40 of which fail on
117
+ `easyvista-python-client` 0.4.0's converter. Reverting any one fix alone fails at least
118
+ one test of the content suite on both.
119
+ - `content/tests/test_properties.py` holds seeded generators to three
120
+ properties: a body displays what its HTML displayed, is a fixed point,
121
+ and keeps its words in order. Against 0.6.0 all 16 tests fail.
122
+ - `content/tests/test_cost.py` replaces the 20-second budgets on long bodies
123
+ with growth tests, `time(4n) / time(n) < 8`, which a quadratic pass fails
124
+ at a few thousand items.
125
+ - Four guards that no test caught are pinned, each by a test that fails
126
+ without it: a second `<` before a space keeps one escape, a header cell
127
+ escapes a `|` in `<kbd>` or `<samp>` and splits a line break in inline
128
+ code, a table inside an `<a>` without `href` stays a table, and an ordered
129
+ item numbered 10 or more indents its content by its bullet's width. A
130
+ count pins that the walk finding blocks inside `<u>`, `<mark>` and `<ins>`
131
+ checks each tag about once.
132
+ - The display oracle treats a flattened cell's edge as a word boundary, as a
133
+ browser does, and reads `start` with `isdecimal`.
134
+
135
+ ## 0.6.0 — 2026-10-01
136
+
137
+ ### Changed (breaking)
138
+
139
+ - **Python 3.10 is no longer supported; 3.11 is the minimum.** The
140
+ `typing-extensions` and `tomli` backports it needed are dropped.
141
+ - **Content conversion is rebuilt on three libraries: markdownify,
142
+ mdformat and cmark-gfm.** `from_transport` reads GLPI's HTML with
143
+ `markdownify`, and `mdformat` re-renders that Markdown from its syntax
144
+ tree, so it keeps only the escapes CommonMark needs. `to_transport`
145
+ renders through `cmark-gfm`, the GitHub reference implementation, in
146
+ place of python-markdown. A thin layer of glue sits on top. Measured on
147
+ 346 real bodies sampled from a GLPI 11 instance:
148
+ - 322 display the same after a round trip, against 299 before;
149
+ - 344 read back as the same Markdown, against 240.
150
+
151
+ Of 205 realistic caller-written Markdown documents, all 205 survive
152
+ Markdown → HTML → Markdown with the same display.
153
+ - **Markdown is rendered as CommonMark with GFM tables.** A newline is a
154
+ line break, as `nl2br` made it before. Raw HTML passes through.
155
+ Differences you may see in Markdown you write:
156
+ - a list or a table written straight after a line now starts a list or a
157
+ table, where python-markdown wanted a blank line first;
158
+ - lists nested by two or three spaces nest;
159
+ - `1)` starts a numbered list;
160
+ - `#Important`, with no space, is text rather than a heading;
161
+ - `*a **b** c*` keeps its bold;
162
+ - a backslash ending a line is a line break, so write `C:\Temp\` at the
163
+ end of a line as `` `C:\Temp\` ``;
164
+ - `<word>` is read as an HTML tag, so put a placeholder such as `<login>`
165
+ in backticks.
166
+ - **`.content` is spelled as canonical CommonMark.** A line break reads
167
+ back as `\` and a newline, a nested list is indented by its bullet's
168
+ width, and a table comes back unpadded. Text that would otherwise read as
169
+ syntax is escaped: `__init__` reads `\_\_init\_\_`, and a `* point` line
170
+ reads `\* point`. Stored digests of `.content` change once.
171
+ - **A plain-text body is literal text on the read path.** A value with no
172
+ HTML element used to come back verbatim and be rendered as Markdown. It is
173
+ now read as GLPI displays it, its lines as lines.
174
+ `GlpiContentConverter.from_transport` takes `plain_text_is_markdown`.
175
+ `True` is what the write models' validator passes: caller-authored
176
+ Markdown passes verbatim unless it starts with an HTML tag, so Markdown
177
+ carrying an inline `<br>` or `<kbd>` stays Markdown.
178
+ - **Dependencies.**
179
+ - Added: `cmarkgfm>=2025.10` (compiled wheels for CPython 3.11–3.14 on
180
+ Linux, macOS and Windows), `mdformat>=0.7.22,<0.8`,
181
+ `mdformat-tables>=1.0` and `markdown-it-py>=3.0`.
182
+ - Dropped: `markdown`. python-markdown 3.11 had broken the previous
183
+ reader.
184
+ - Raised: `beautifulsoup4>=4.15`, which fixed the parser defect that
185
+ dropped the text after a `<br />` in a body that also held a bare
186
+ `<br>`. That removes the workaround.
187
+
188
+ ### Fixed
189
+
190
+ - **Literal text came back as Markdown syntax.** These now read back as the
191
+ text a user typed:
192
+ - `\serveur\compta`, which had lost a backslash;
193
+ - `__init__` and `______`, which had become bold;
194
+ - a `-----` line under text, which had made a heading;
195
+ - `* point` and `> merci` lines, which had become a list and a quote;
196
+ - `[1]: https://...`, which had been consumed as a reference definition;
197
+ - a `|` in a table cell, which had dropped the rest of the row.
198
+ - **A table nested in a table cell lost all its text.** That is the usual
199
+ layout of an e-mail signature. The inner table is now written as its
200
+ cells' text, its line breaks kept as `<br>`.
201
+ - **Nested lists flattened on the first write.** Nested items, the text
202
+ after a nested list, and numbering, `start` included, survive.
203
+ - `<script>`, `<style>` and `<title>` bodies no longer leak into the text.
204
+ - A blank line inside a paragraph (`<br><br>`, or Outlook's
205
+ `<br>&nbsp;<br>`) is kept.
206
+ - A label in bold right before a figure, as in `<b>Total:</b>12`, keeps its
207
+ bold.
208
+ - A code fence keeps its language, and a `|` inside code in a table cell no
209
+ longer splits the row.
210
+ - A long body converts in linear time, and a body nested deeper than the
211
+ stack is read as its text instead of raising.
212
+
213
+ ### Known limitations
214
+
215
+ - A Markdown table needs a header row and the same number of cells in every
216
+ row. A header-less HTML table gains an empty header row, and a row that
217
+ spans the table gains empty cells.
218
+ - Struck-through text is kept as raw `<s>`, since CommonMark has no
219
+ strikethrough.
220
+ - Literal text that looks like syntax is sometimes escaped where
221
+ CommonMark would not need it, for example `5\*3` or `x \<= y`. It
222
+ displays as typed.
223
+
7
224
  ## 0.5.0 — 2026-09-08
8
225
 
9
226
  ### Fixed
@@ -38,7 +38,7 @@ python -m sphinx -W --keep-going -b html docs docs/_build/html
38
38
 
39
39
  ## GitHub Actions
40
40
 
41
- - `.github/workflows/ci.yml` runs tests for Python 3.10 through 3.14 on pull
41
+ - `.github/workflows/ci.yml` runs tests for Python 3.11 through 3.14 on pull
42
42
  requests and pushes to `main`.
43
43
  - The same workflow runs `ruff`, `mypy`, and a warning-free Sphinx build on
44
44
  Python 3.12.
@@ -63,3 +63,19 @@ python -m sphinx -W --keep-going -b html docs docs/_build/html
63
63
  library core.
64
64
  - Add tests for payload serialization and response normalization when adding
65
65
  endpoints.
66
+
67
+ ### The GLPI OpenAPI contract
68
+
69
+ The models under `glpi_python_client/models/api_schema/` mirror
70
+ `components.schemas.*` from the GLPI High-Level REST API document,
71
+ including which fields are `readOnly`. That document is not committed —
72
+ it is ~14 MB and instance-specific. Fetch your instance's copy to the
73
+ path the models cite:
74
+
75
+ ```bash
76
+ curl -sk "<your GLPI base>/api.php/v2.3/doc.json" -o docs/api_contract/api.json
77
+ ```
78
+
79
+ `docs/api_contract/` is gitignored. Nothing in CI checks the models
80
+ against it, so when you add or change a model, diff it against the
81
+ contract by hand.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: glpi-python-client
3
- Version: 0.5.0
3
+ Version: 0.6.1
4
4
  Summary: A typed Python client for GLPI ITSM APIs.
5
5
  Project-URL: Homepage, https://github.com/baraline/glpi_python_client
6
6
  Project-URL: Documentation, https://glpi-python-client.readthedocs.io/en/latest/
@@ -15,7 +15,6 @@ Classifier: Intended Audience :: Developers
15
15
  Classifier: License :: OSI Approved :: MIT License
16
16
  Classifier: Operating System :: OS Independent
17
17
  Classifier: Programming Language :: Python :: 3
18
- Classifier: Programming Language :: Python :: 3.10
19
18
  Classifier: Programming Language :: Python :: 3.11
20
19
  Classifier: Programming Language :: Python :: 3.12
21
20
  Classifier: Programming Language :: Python :: 3.13
@@ -23,16 +22,18 @@ Classifier: Programming Language :: Python :: 3.14
23
22
  Classifier: Topic :: Internet :: WWW/HTTP
24
23
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
25
24
  Classifier: Typing :: Typed
26
- Requires-Python: >=3.10
27
- Requires-Dist: beautifulsoup4>=4.12
25
+ Requires-Python: >=3.11
26
+ Requires-Dist: beautifulsoup4>=4.15
27
+ Requires-Dist: cmarkgfm>=2025.10
28
28
  Requires-Dist: httpx>=0.28
29
29
  Requires-Dist: lxml>=4.9
30
- Requires-Dist: markdown>=3.6
31
- Requires-Dist: markdownify>=0.13
30
+ Requires-Dist: markdown-it-py<4,>=3.0
31
+ Requires-Dist: markdownify<1.3,>=1.2.3
32
+ Requires-Dist: mdformat-tables<1.1,>=1.0
33
+ Requires-Dist: mdformat<0.8,>=0.7.22
32
34
  Requires-Dist: pydantic>=2.8
33
35
  Requires-Dist: sniffio>=1.3
34
36
  Requires-Dist: tenacity>=8.2
35
- Requires-Dist: typing-extensions>=4.7; python_version < '3.11'
36
37
  Requires-Dist: tzdata>=2024.1; platform_system == 'Windows'
37
38
  Provides-Extra: dev
38
39
  Requires-Dist: build>=1.2; extra == 'dev'
@@ -45,7 +46,6 @@ Requires-Dist: pytest>=8.0; extra == 'dev'
45
46
  Requires-Dist: ruff>=0.6; extra == 'dev'
46
47
  Requires-Dist: sphinx-rtd-theme>=2.0; extra == 'dev'
47
48
  Requires-Dist: sphinx<8.2,>=7.2; extra == 'dev'
48
- Requires-Dist: tomli>=2.0; (python_version < '3.11') and extra == 'dev'
49
49
  Requires-Dist: twine>=5.1; extra == 'dev'
50
50
  Requires-Dist: unasync>=0.6; extra == 'dev'
51
51
  Requires-Dist: vulture>=2.11; extra == 'dev'
@@ -53,7 +53,6 @@ Provides-Extra: docs
53
53
  Requires-Dist: numpydoc>=1.8; extra == 'docs'
54
54
  Requires-Dist: sphinx-rtd-theme>=2.0; extra == 'docs'
55
55
  Requires-Dist: sphinx<8.2,>=7.2; extra == 'docs'
56
- Requires-Dist: tomli>=2.0; (python_version < '3.11') and extra == 'docs'
57
56
  Description-Content-Type: text/markdown
58
57
 
59
58
  # glpi-python-client
@@ -61,7 +60,7 @@ Description-Content-Type: text/markdown
61
60
  [![CI](https://github.com/baraline/glpi_python_client/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/baraline/glpi_python_client/actions/workflows/ci.yml)
62
61
  [![Coverage](https://codecov.io/gh/baraline/glpi_python_client/branch/main/graph/badge.svg)](https://codecov.io/gh/baraline/glpi_python_client)
63
62
  [![License](https://img.shields.io/github/license/baraline/glpi_python_client)](LICENSE)
64
- [![Python](https://img.shields.io/badge/python-3.10%2B-blue)](https://github.com/baraline/glpi_python_client)
63
+ [![Python](https://img.shields.io/badge/python-3.11%2B-blue)](https://github.com/baraline/glpi_python_client)
65
64
  [![Docs](https://readthedocs.org/projects/glpi-python-client/badge/?version=latest)](https://glpi-python-client.readthedocs.io/en/latest/)
66
65
 
67
66
  `glpi-python-client` is a typed Python client for the GLPI REST API.
@@ -3,7 +3,7 @@
3
3
  [![CI](https://github.com/baraline/glpi_python_client/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/baraline/glpi_python_client/actions/workflows/ci.yml)
4
4
  [![Coverage](https://codecov.io/gh/baraline/glpi_python_client/branch/main/graph/badge.svg)](https://codecov.io/gh/baraline/glpi_python_client)
5
5
  [![License](https://img.shields.io/github/license/baraline/glpi_python_client)](LICENSE)
6
- [![Python](https://img.shields.io/badge/python-3.10%2B-blue)](https://github.com/baraline/glpi_python_client)
6
+ [![Python](https://img.shields.io/badge/python-3.11%2B-blue)](https://github.com/baraline/glpi_python_client)
7
7
  [![Docs](https://readthedocs.org/projects/glpi-python-client/badge/?version=latest)](https://glpi-python-client.readthedocs.io/en/latest/)
8
8
 
9
9
  `glpi-python-client` is a typed Python client for the GLPI REST API.
@@ -113,18 +113,25 @@ conversion happens, which buys two things: listing records costs nothing
113
113
  per body, and a body that cannot be converted no longer stops the rest of
114
114
  its page being read.
115
115
 
116
+ The Markdown is CommonMark with GFM tables, rendered by cmark-gfm. It
117
+ spells a body's text as literal text -- ``\_\_init\_\_``, ``\\\serveur``,
118
+ ``\# pas un titre`` -- so that rendering it displays what GLPI displayed and
119
+ reading that back gives the same Markdown. That is the aim; the user guide
120
+ lists the shapes where it falls short. Underline, highlight and struck text
121
+ stay as raw ``<u>``, ``<mark>``, ``<ins>`` and ``<s>``. Neither direction
122
+ sanitises: raw HTML and ``javascript:`` links pass through. A write model
123
+ keeps the caller's Markdown as written, stripped at both ends, unless it
124
+ starts with ``<`` and holds an HTML element, and sends a lone surrogate as
125
+ U+FFFD. See :ref:`content-conversion`.
126
+
116
127
  Very deeply nested HTML is the case worth knowing about.
117
128
  ``markdownify`` walks the document recursively and runs out of stack at
118
- around 494 levels of nesting. The converter does not try to predict
119
- that: it attempts the conversion and, if the walk does not fit, strips
120
- tags instead. It degrades, it never truncates, and it does not raise:
121
- every character the normal rendering would have produced still appears.
122
- What is lost is structure rather than words — link targets and image alt
123
- text, code fencing and ``<pre>`` indentation, ``&nbsp;`` alignment.
124
- Because the budget is the stack left when the conversion starts, the
125
- same body can convert from one call site and degrade from a deeper one.
126
- Anything else that goes wrong in either direction raises
127
- :class:`GlpiContentError`.
129
+ a few hundred levels of nesting. The converter attempts the conversion
130
+ and, if the walk does not fit, reads the body's text instead, a line per
131
+ block: the words survive, the structure does not. Any ``ValueError`` from
132
+ the conversion degrades the same way: markdownify raises one for a
133
+ ``colspan`` or ``start`` it cannot read as a number. Anything else that
134
+ goes wrong in either direction raises :class:`GlpiContentError`.
128
135
 
129
136
  Because the conversion is cached on first read, a read model should be
130
137
  treated as immutable afterwards: assigning to ``content_html``, or
@@ -499,6 +506,121 @@ The companion mixin methods are exposed on :class:`GlpiClient` /
499
506
  :undoc-members:
500
507
  :show-inheritance:
501
508
 
509
+ Computers
510
+ ---------
511
+
512
+ .. autoclass:: GetComputer
513
+ :members:
514
+ :undoc-members:
515
+ :show-inheritance:
516
+
517
+ .. autoclass:: PostComputer
518
+ :members:
519
+ :undoc-members:
520
+ :show-inheritance:
521
+
522
+ .. autoclass:: PatchComputer
523
+ :members:
524
+ :undoc-members:
525
+ :show-inheritance:
526
+
527
+ .. autoclass:: DeleteComputer
528
+ :members:
529
+ :undoc-members:
530
+ :show-inheritance:
531
+
532
+ Computer Contract Links
533
+ -----------------------
534
+
535
+ .. autoclass:: GetContractItem
536
+ :members:
537
+ :undoc-members:
538
+ :show-inheritance:
539
+
540
+ .. autoclass:: PostContractItem
541
+ :members:
542
+ :undoc-members:
543
+ :show-inheritance:
544
+
545
+ .. autoclass:: PatchContractItem
546
+ :members:
547
+ :undoc-members:
548
+ :show-inheritance:
549
+
550
+ .. autoclass:: DeleteContractItem
551
+ :members:
552
+ :undoc-members:
553
+ :show-inheritance:
554
+
555
+ Contracts
556
+ ---------
557
+
558
+ .. autoclass:: GetContract
559
+ :members:
560
+ :undoc-members:
561
+ :show-inheritance:
562
+
563
+ .. autoclass:: PostContract
564
+ :members:
565
+ :undoc-members:
566
+ :show-inheritance:
567
+
568
+ .. autoclass:: PatchContract
569
+ :members:
570
+ :undoc-members:
571
+ :show-inheritance:
572
+
573
+ .. autoclass:: DeleteContract
574
+ :members:
575
+ :undoc-members:
576
+ :show-inheritance:
577
+
578
+ Contract Costs
579
+ --------------
580
+
581
+ .. autoclass:: GetContractCost
582
+ :members:
583
+ :undoc-members:
584
+ :show-inheritance:
585
+
586
+ .. autoclass:: PostContractCost
587
+ :members:
588
+ :undoc-members:
589
+ :show-inheritance:
590
+
591
+ .. autoclass:: PatchContractCost
592
+ :members:
593
+ :undoc-members:
594
+ :show-inheritance:
595
+
596
+ .. autoclass:: DeleteContractCost
597
+ :members:
598
+ :undoc-members:
599
+ :show-inheritance:
600
+
601
+ Contract Types
602
+ --------------
603
+
604
+ .. autoclass:: GetContractType
605
+ :members:
606
+ :undoc-members:
607
+ :show-inheritance:
608
+
609
+ .. autoclass:: PostContractType
610
+ :members:
611
+ :undoc-members:
612
+ :show-inheritance:
613
+
614
+ .. autoclass:: PatchContractType
615
+ :members:
616
+ :undoc-members:
617
+ :show-inheritance:
618
+
619
+ .. autoclass:: DeleteContractType
620
+ :members:
621
+ :undoc-members:
622
+ :show-inheritance:
623
+
502
624
  Enums
503
625
  -----
504
626
 
@@ -547,6 +669,11 @@ Enums
547
669
  :undoc-members:
548
670
  :show-inheritance:
549
671
 
672
+ .. autoclass:: GlpiContractRenewalType
673
+ :members:
674
+ :undoc-members:
675
+ :show-inheritance:
676
+
550
677
  Package Metadata
551
678
  ----------------
552
679
 
@@ -5,11 +5,7 @@ from __future__ import annotations
5
5
  from datetime import date
6
6
  from importlib.metadata import PackageNotFoundError, version
7
7
  from pathlib import Path
8
-
9
- try:
10
- from tomllib import loads as toml_loads
11
- except ModuleNotFoundError:
12
- from tomli import loads as toml_loads
8
+ from tomllib import loads as toml_loads
13
9
 
14
10
 
15
11
  def _read_project_version() -> str:
@@ -86,13 +86,17 @@ python -m pytest
86
86
  articles (`content` and `description`) and article revisions. It is
87
87
  wired into the models by `models/api_schema/_content.py`, eagerly on
88
88
  the write models and through a cached property on the read ones.
89
- Inbound HTML too deep for `markdownify` to walk is tag-stripped
89
+ Inbound HTML too deep for `markdownify` to walk, or on which it
90
+ raises `ValueError` (a `colspan` or `start` it cannot read as a
91
+ number, among others), is tag-stripped
90
92
  rather than parsed. The depth is not predicted: the conversion is
91
93
  attempted and the `RecursionError` answered, because the budget is the
92
94
  caller's remaining stack and no bound computed in advance can know it.
93
- The module docstring carries the derivation and the rejected
95
+ The 0.5.0 changelog entry carries the derivation and the rejected
94
96
  alternatives (`sys.setrecursionlimit`, and a thread with a larger
95
- stack, which needs the same global). The prohibition is enforced by
97
+ stack, which needs the same global). The reader is kept identical, but
98
+ for names, messages, docstrings and an import guard, to
99
+ `easyvista-python-client`'s; change the two together. The prohibition is enforced by
96
100
  `testing/tests/test_raise_site_audit.py`, not just written down.
97
101
  - `glpi_python_client.testing` exposes `make_client` and
98
102
  `make_async_client` factories that produce in-memory clients with no
@@ -4,9 +4,14 @@ Installation
4
4
  Requirements
5
5
  ------------
6
6
 
7
- ``glpi-python-client`` supports Python 3.10 and newer. Runtime dependencies are installed
7
+ ``glpi-python-client`` supports Python 3.11 and newer. Runtime dependencies are installed
8
8
  from the package metadata and include ``httpx``, ``tenacity``,
9
- ``beautifulsoup4``, ``lxml``, and ``pydantic``.
9
+ ``beautifulsoup4``, ``lxml``, and ``pydantic``, plus the libraries the
10
+ rich-text converter is built on: ``markdownify``, ``mdformat``,
11
+ ``mdformat-tables`` and ``markdown-it-py`` to read, and ``cmarkgfm`` to
12
+ write. The reader overrides private surfaces of ``markdownify`` and
13
+ ``mdformat``, so those four carry upper bounds; ``pyproject.toml`` gives the
14
+ reason for each.
10
15
 
11
16
  Install from PyPI
12
17
  -----------------
@@ -92,7 +92,7 @@ GitHub Actions and Read the Docs
92
92
  The repository ships with two GitHub Actions workflows:
93
93
 
94
94
  * ``.github/workflows/ci.yml`` runs on pull requests and pushes to ``main``.
95
- It executes ``pytest`` on Python 3.10 through 3.14, then runs ``ruff``,
95
+ It executes ``pytest`` on Python 3.11 through 3.14, then runs ``ruff``,
96
96
  ``mypy``, and the Sphinx build on Python 3.12.
97
97
  * ``.github/workflows/release.yml`` runs on published GitHub releases. It
98
98
  repeats the quality checks, builds the source and wheel distributions,