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.
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/.gitignore +1 -1
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/CHANGELOG.md +217 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/CONTRIBUTING.md +17 -1
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/PKG-INFO +9 -10
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/README.md +1 -1
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/api_reference.rst +137 -10
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/conf.py +1 -5
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/development.md +7 -3
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/installation.rst +7 -2
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/publishing_rtd.rst +1 -1
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/user_guide.rst +461 -13
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/__init__.py +43 -1
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/auth/_v1_session.py +3 -3
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/auth/auth.py +3 -3
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/_base_client.py +1 -7
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/__init__.py +13 -3
- glpi_python_client-0.6.1/glpi_python_client/_async/clients/api/assets/__init__.py +7 -0
- glpi_python_client-0.6.1/glpi_python_client/_async/clients/api/assets/_computer.py +427 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/dropdowns/__init__.py +4 -1
- glpi_python_client-0.6.1/glpi_python_client/_async/clients/api/dropdowns/_contract_type.py +220 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/management/__init__.py +2 -1
- glpi_python_client-0.6.1/glpi_python_client/_async/clients/api/management/_contract.py +411 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/client.py +7 -6
- {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
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_errors.py +2 -2
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/auth/_v1_session.py +3 -3
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/auth/auth.py +3 -3
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/_base_client.py +1 -7
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/__init__.py +13 -3
- glpi_python_client-0.6.1/glpi_python_client/_sync/clients/api/assets/__init__.py +7 -0
- glpi_python_client-0.6.1/glpi_python_client/_sync/clients/api/assets/_computer.py +427 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/dropdowns/__init__.py +4 -1
- glpi_python_client-0.6.1/glpi_python_client/_sync/clients/api/dropdowns/_contract_type.py +220 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/management/__init__.py +2 -1
- glpi_python_client-0.6.1/glpi_python_client/_sync/clients/api/management/_contract.py +411 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/client.py +7 -6
- {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
- glpi_python_client-0.6.1/glpi_python_client/content/conversion.py +832 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/__init__.py +45 -1
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/__init__.py +1 -1
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/_content.py +21 -11
- glpi_python_client-0.6.1/glpi_python_client/models/api_schema/assets/__init__.py +25 -0
- glpi_python_client-0.6.1/glpi_python_client/models/api_schema/assets/_computer.py +257 -0
- glpi_python_client-0.6.1/glpi_python_client/models/api_schema/assets/_contract_item.py +102 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/dropdowns/__init__.py +10 -0
- glpi_python_client-0.6.1/glpi_python_client/models/api_schema/dropdowns/_contract_type.py +100 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/enums.py +14 -0
- glpi_python_client-0.6.1/glpi_python_client/models/api_schema/management/__init__.py +35 -0
- glpi_python_client-0.6.1/glpi_python_client/models/api_schema/management/_contract.py +328 -0
- glpi_python_client-0.6.1/glpi_python_client/models/api_schema/management/_contract_cost.py +139 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/custom_schema/_ticket_context.py +18 -6
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/pyproject.toml +31 -12
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/README.md +3 -1
- glpi_python_client-0.6.1/skills/glpi-asset-workflow/SKILL.md +89 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-client-setup/SKILL.md +2 -2
- glpi_python_client-0.6.1/skills/glpi-contract-workflow/SKILL.md +123 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-document-workflow/SKILL.md +2 -2
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-knowledge-base/SKILL.md +3 -3
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-plugin-fields/SKILL.md +3 -3
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-reporting-and-context/SKILL.md +2 -2
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-team-members/SKILL.md +2 -2
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-ticket-timeline/SKILL.md +4 -3
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-ticket-workflow/SKILL.md +4 -3
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/skills/glpi-user-location-provisioning/SKILL.md +2 -2
- glpi_python_client-0.5.0/glpi_python_client/content/conversion.py +0 -729
- glpi_python_client-0.5.0/glpi_python_client/models/api_schema/management/__init__.py +0 -15
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/.pre-commit-config.yaml +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/.readthedocs.yaml +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/LICENSE +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/_static/.gitkeep +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/development_rtd.rst +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/index.rst +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/publishing.md +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/docs/sponsoring.rst +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/_concurrency.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/_testing.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/auth/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/administration/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/administration/_entity.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/administration/_user.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/_team.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/_ticket.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/timeline/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/timeline/_document.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/timeline/_followup.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/timeline/_solution.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/assistance/timeline/_task.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/dropdowns/_location.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/knowledgebase/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/knowledgebase/_article.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/knowledgebase/_category.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/knowledgebase/_comment.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/knowledgebase/_revision.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/management/_document.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/plugins/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/api/plugins/_fields.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/commons/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/commons/_config.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/commons/_filters.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/commons/_http.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/commons/_payloads.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/commons/_transport.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/custom/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/custom/_statistics.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_async/clients/custom/_ticket_context.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/_concurrency.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/_testing.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/auth/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/administration/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/administration/_entity.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/administration/_user.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/_team.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/_ticket.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/timeline/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/timeline/_document.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/timeline/_followup.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/timeline/_solution.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/assistance/timeline/_task.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/dropdowns/_location.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/knowledgebase/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/knowledgebase/_article.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/knowledgebase/_category.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/knowledgebase/_comment.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/knowledgebase/_revision.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/management/_document.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/plugins/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/api/plugins/_fields.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/commons/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/commons/_config.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/commons/_filters.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/commons/_http.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/commons/_payloads.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/commons/_transport.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/custom/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/custom/_statistics.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/_sync/clients/custom/_ticket_context.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/content/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/_base.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/_common.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/administration/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/administration/_entity.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/administration/_user.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/_team.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/_ticket.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/timeline/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/timeline/_document.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/timeline/_followup.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/timeline/_solution.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/assistance/timeline/_task.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/dropdowns/_location.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/knowledgebase/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/knowledgebase/_article.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/knowledgebase/_category.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/knowledgebase/_comment.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/knowledgebase/_revision.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/management/_document.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/plugins/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/api_schema/plugins/_fields.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/models/custom_schema/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/py.typed +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/rsql.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/testing/__init__.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/testing/fixtures.py +0 -0
- {glpi_python_client-0.5.0 → glpi_python_client-0.6.1}/glpi_python_client/testing/utils.py +0 -0
|
@@ -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> <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.
|
|
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.
|
|
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.
|
|
27
|
-
Requires-Dist: beautifulsoup4>=4.
|
|
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
|
|
31
|
-
Requires-Dist: markdownify
|
|
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
|
[](https://github.com/baraline/glpi_python_client/actions/workflows/ci.yml)
|
|
62
61
|
[](https://codecov.io/gh/baraline/glpi_python_client)
|
|
63
62
|
[](LICENSE)
|
|
64
|
-
[](https://github.com/baraline/glpi_python_client)
|
|
65
64
|
[](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
|
[](https://github.com/baraline/glpi_python_client/actions/workflows/ci.yml)
|
|
4
4
|
[](https://codecov.io/gh/baraline/glpi_python_client)
|
|
5
5
|
[](LICENSE)
|
|
6
|
-
[](https://github.com/baraline/glpi_python_client)
|
|
7
7
|
[](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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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,
|