glpi-python-client 0.4.3__tar.gz → 0.6.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/.gitignore +6 -1
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/CHANGELOG.md +469 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/CONTRIBUTING.md +17 -1
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/PKG-INFO +14 -11
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/README.md +6 -2
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/docs/api_reference.rst +177 -5
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/docs/conf.py +1 -5
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/docs/development.md +12 -1
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/docs/installation.rst +1 -1
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/docs/publishing_rtd.rst +1 -1
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/docs/user_guide.rst +320 -11
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/__init__.py +45 -1
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/auth/_v1_session.py +3 -3
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/auth/auth.py +3 -3
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/_base_client.py +1 -7
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/__init__.py +13 -3
- glpi_python_client-0.6.0/glpi_python_client/_async/clients/api/assets/__init__.py +7 -0
- glpi_python_client-0.6.0/glpi_python_client/_async/clients/api/assets/_computer.py +427 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/dropdowns/__init__.py +4 -1
- glpi_python_client-0.6.0/glpi_python_client/_async/clients/api/dropdowns/_contract_type.py +220 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/management/__init__.py +2 -1
- glpi_python_client-0.6.0/glpi_python_client/_async/clients/api/management/_contract.py +411 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/client.py +7 -6
- {glpi_python_client-0.4.3/glpi_python_client/_sync → glpi_python_client-0.6.0/glpi_python_client/_async}/clients/commons/_constants.py +9 -1
- {glpi_python_client-0.4.3/glpi_python_client/_sync → glpi_python_client-0.6.0/glpi_python_client/_async}/clients/commons/_payloads.py +8 -6
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_errors.py +36 -4
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/auth/_v1_session.py +3 -3
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/auth/auth.py +3 -3
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/_base_client.py +1 -7
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/__init__.py +13 -3
- glpi_python_client-0.6.0/glpi_python_client/_sync/clients/api/assets/__init__.py +7 -0
- glpi_python_client-0.6.0/glpi_python_client/_sync/clients/api/assets/_computer.py +427 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/dropdowns/__init__.py +4 -1
- glpi_python_client-0.6.0/glpi_python_client/_sync/clients/api/dropdowns/_contract_type.py +220 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/management/__init__.py +2 -1
- glpi_python_client-0.6.0/glpi_python_client/_sync/clients/api/management/_contract.py +411 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/client.py +7 -6
- {glpi_python_client-0.4.3/glpi_python_client/_async → glpi_python_client-0.6.0/glpi_python_client/_sync}/clients/commons/_constants.py +9 -1
- {glpi_python_client-0.4.3/glpi_python_client/_async → glpi_python_client-0.6.0/glpi_python_client/_sync}/clients/commons/_payloads.py +8 -6
- glpi_python_client-0.6.0/glpi_python_client/content/conversion.py +675 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/__init__.py +48 -3
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/_base.py +135 -6
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/__init__.py +8 -1
- glpi_python_client-0.6.0/glpi_python_client/models/api_schema/_content.py +291 -0
- glpi_python_client-0.6.0/glpi_python_client/models/api_schema/assets/__init__.py +25 -0
- glpi_python_client-0.6.0/glpi_python_client/models/api_schema/assets/_computer.py +257 -0
- glpi_python_client-0.6.0/glpi_python_client/models/api_schema/assets/_contract_item.py +102 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/assistance/_ticket.py +30 -9
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/assistance/timeline/_followup.py +29 -8
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/assistance/timeline/_solution.py +29 -8
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/assistance/timeline/_task.py +29 -8
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/dropdowns/__init__.py +10 -0
- glpi_python_client-0.6.0/glpi_python_client/models/api_schema/dropdowns/_contract_type.py +100 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/enums.py +14 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/knowledgebase/_article.py +49 -7
- glpi_python_client-0.6.0/glpi_python_client/models/api_schema/knowledgebase/_revision.py +58 -0
- glpi_python_client-0.6.0/glpi_python_client/models/api_schema/management/__init__.py +35 -0
- glpi_python_client-0.6.0/glpi_python_client/models/api_schema/management/_contract.py +328 -0
- glpi_python_client-0.6.0/glpi_python_client/models/api_schema/management/_contract_cost.py +139 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/custom_schema/_ticket_context.py +29 -6
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/rsql.py +74 -14
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/pyproject.toml +15 -12
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/skills/README.md +3 -1
- glpi_python_client-0.6.0/skills/glpi-asset-workflow/SKILL.md +89 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/skills/glpi-client-setup/SKILL.md +14 -5
- glpi_python_client-0.6.0/skills/glpi-contract-workflow/SKILL.md +123 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/skills/glpi-document-workflow/SKILL.md +2 -2
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/skills/glpi-knowledge-base/SKILL.md +4 -2
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/skills/glpi-plugin-fields/SKILL.md +3 -3
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/skills/glpi-reporting-and-context/SKILL.md +3 -3
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/skills/glpi-team-members/SKILL.md +2 -2
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/skills/glpi-ticket-timeline/SKILL.md +5 -3
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/skills/glpi-ticket-workflow/SKILL.md +6 -3
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/skills/glpi-user-location-provisioning/SKILL.md +2 -2
- glpi_python_client-0.4.3/glpi_python_client/content/conversion.py +0 -130
- glpi_python_client-0.4.3/glpi_python_client/models/api_schema/_content.py +0 -83
- glpi_python_client-0.4.3/glpi_python_client/models/api_schema/knowledgebase/_revision.py +0 -35
- glpi_python_client-0.4.3/glpi_python_client/models/api_schema/management/__init__.py +0 -15
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/.pre-commit-config.yaml +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/.readthedocs.yaml +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/LICENSE +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/docs/_static/.gitkeep +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/docs/development_rtd.rst +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/docs/index.rst +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/docs/publishing.md +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/docs/sponsoring.rst +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/_concurrency.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/_testing.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/auth/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/administration/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/administration/_entity.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/administration/_user.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/assistance/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/assistance/_team.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/assistance/_ticket.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/assistance/timeline/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/assistance/timeline/_document.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/assistance/timeline/_followup.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/assistance/timeline/_solution.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/assistance/timeline/_task.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/dropdowns/_location.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/knowledgebase/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/knowledgebase/_article.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/knowledgebase/_category.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/knowledgebase/_comment.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/knowledgebase/_revision.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/management/_document.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/plugins/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/api/plugins/_fields.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/commons/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/commons/_config.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/commons/_filters.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/commons/_http.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/commons/_transport.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/custom/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/custom/_statistics.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_async/clients/custom/_ticket_context.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/_concurrency.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/_testing.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/auth/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/administration/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/administration/_entity.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/administration/_user.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/assistance/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/assistance/_team.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/assistance/_ticket.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/assistance/timeline/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/assistance/timeline/_document.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/assistance/timeline/_followup.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/assistance/timeline/_solution.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/assistance/timeline/_task.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/dropdowns/_location.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/knowledgebase/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/knowledgebase/_article.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/knowledgebase/_category.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/knowledgebase/_comment.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/knowledgebase/_revision.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/management/_document.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/plugins/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/api/plugins/_fields.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/commons/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/commons/_config.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/commons/_filters.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/commons/_http.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/commons/_transport.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/custom/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/custom/_statistics.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/_sync/clients/custom/_ticket_context.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/content/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/_common.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/administration/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/administration/_entity.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/administration/_user.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/assistance/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/assistance/_team.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/assistance/timeline/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/assistance/timeline/_document.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/dropdowns/_location.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/knowledgebase/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/knowledgebase/_category.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/knowledgebase/_comment.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/management/_document.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/plugins/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/api_schema/plugins/_fields.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/models/custom_schema/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/py.typed +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/testing/__init__.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/testing/fixtures.py +0 -0
- {glpi_python_client-0.4.3 → glpi_python_client-0.6.0}/glpi_python_client/testing/utils.py +0 -0
|
@@ -33,7 +33,12 @@ CLAUDE.md
|
|
|
33
33
|
docs/superpowers/*
|
|
34
34
|
|
|
35
35
|
# Large generated GLPI API contract (kept locally, not tracked)
|
|
36
|
-
docs/
|
|
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.*
|
|
40
|
+
|
|
41
|
+
# One-shot live-instance probe scripts. They are standalone investigations
|
|
42
|
+
# (a main() run by hand against preprod), not collected tests -- the findings
|
|
43
|
+
# get written up in CHANGELOG.md, the scripts stay local.
|
|
44
|
+
integration_tests/probe_*.py
|
|
@@ -4,6 +4,450 @@ 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.0 — 2026-10-01
|
|
8
|
+
|
|
9
|
+
### Changed (breaking)
|
|
10
|
+
|
|
11
|
+
- **Python 3.10 is no longer supported; 3.11 is the minimum.** The
|
|
12
|
+
`typing-extensions` and `tomli` backports it needed are dropped.
|
|
13
|
+
- **Content conversion is rebuilt on three libraries: markdownify,
|
|
14
|
+
mdformat and cmark-gfm.** `from_transport` reads GLPI's HTML with
|
|
15
|
+
`markdownify`, and `mdformat` re-renders that Markdown from its syntax
|
|
16
|
+
tree, so it keeps only the escapes CommonMark needs. `to_transport`
|
|
17
|
+
renders through `cmark-gfm`, the GitHub reference implementation, in
|
|
18
|
+
place of python-markdown. A thin layer of glue sits on top. Measured on
|
|
19
|
+
346 real bodies sampled from a GLPI 11 instance:
|
|
20
|
+
- 322 display the same after a round trip, against 299 before;
|
|
21
|
+
- 344 read back as the same Markdown, against 240.
|
|
22
|
+
|
|
23
|
+
Of 205 realistic caller-written Markdown documents, all 205 survive
|
|
24
|
+
Markdown → HTML → Markdown with the same display.
|
|
25
|
+
- **Markdown is rendered as CommonMark with GFM tables.** A newline is a
|
|
26
|
+
line break, as `nl2br` made it before. Raw HTML passes through.
|
|
27
|
+
Differences you may see in Markdown you write:
|
|
28
|
+
- a list or a table written straight after a line now starts a list or a
|
|
29
|
+
table, where python-markdown wanted a blank line first;
|
|
30
|
+
- lists nested by two or three spaces nest;
|
|
31
|
+
- `1)` starts a numbered list;
|
|
32
|
+
- `#Important`, with no space, is text rather than a heading;
|
|
33
|
+
- `*a **b** c*` keeps its bold;
|
|
34
|
+
- a backslash ending a line is a line break, so write `C:\Temp\` at the
|
|
35
|
+
end of a line as `` `C:\Temp\` ``;
|
|
36
|
+
- `<word>` is read as an HTML tag, so put a placeholder such as `<login>`
|
|
37
|
+
in backticks.
|
|
38
|
+
- **`.content` is spelled as canonical CommonMark.** A line break reads
|
|
39
|
+
back as `\` and a newline, a nested list is indented by its bullet's
|
|
40
|
+
width, and a table comes back unpadded. Text that would otherwise read as
|
|
41
|
+
syntax is escaped: `__init__` reads `\_\_init\_\_`, and a `* point` line
|
|
42
|
+
reads `\* point`. Stored digests of `.content` change once.
|
|
43
|
+
- **A plain-text body is literal text on the read path.** A value with no
|
|
44
|
+
HTML element used to come back verbatim and be rendered as Markdown. It is
|
|
45
|
+
now read as GLPI displays it, its lines as lines.
|
|
46
|
+
`GlpiContentConverter.from_transport` takes `plain_text_is_markdown`.
|
|
47
|
+
`True` is what the write models' validator passes: caller-authored
|
|
48
|
+
Markdown passes verbatim unless it starts with an HTML tag, so Markdown
|
|
49
|
+
carrying an inline `<br>` or `<kbd>` stays Markdown.
|
|
50
|
+
- **Dependencies.**
|
|
51
|
+
- Added: `cmarkgfm>=2025.10` (compiled wheels for CPython 3.11–3.14 on
|
|
52
|
+
Linux, macOS and Windows), `mdformat>=0.7.22,<0.8`,
|
|
53
|
+
`mdformat-tables>=1.0` and `markdown-it-py>=3.0`.
|
|
54
|
+
- Dropped: `markdown`. python-markdown 3.11 had broken the previous
|
|
55
|
+
reader.
|
|
56
|
+
- Raised: `beautifulsoup4>=4.15`, which fixed the parser defect that
|
|
57
|
+
dropped the text after a `<br />` in a body that also held a bare
|
|
58
|
+
`<br>`. That removes the workaround.
|
|
59
|
+
|
|
60
|
+
### Fixed
|
|
61
|
+
|
|
62
|
+
- **Literal text came back as Markdown syntax.** These now read back as the
|
|
63
|
+
text a user typed:
|
|
64
|
+
- `\serveur\compta`, which had lost a backslash;
|
|
65
|
+
- `__init__` and `______`, which had become bold;
|
|
66
|
+
- a `-----` line under text, which had made a heading;
|
|
67
|
+
- `* point` and `> merci` lines, which had become a list and a quote;
|
|
68
|
+
- `[1]: https://...`, which had been consumed as a reference definition;
|
|
69
|
+
- a `|` in a table cell, which had dropped the rest of the row.
|
|
70
|
+
- **A table nested in a table cell lost all its text.** That is the usual
|
|
71
|
+
layout of an e-mail signature. The inner table is now written as its
|
|
72
|
+
cells' text, its line breaks kept as `<br>`.
|
|
73
|
+
- **Nested lists flattened on the first write.** Nested items, the text
|
|
74
|
+
after a nested list, and numbering, `start` included, survive.
|
|
75
|
+
- `<script>`, `<style>` and `<title>` bodies no longer leak into the text.
|
|
76
|
+
- A blank line inside a paragraph (`<br><br>`, or Outlook's
|
|
77
|
+
`<br> <br>`) is kept.
|
|
78
|
+
- A label in bold right before a figure, as in `<b>Total:</b>12`, keeps its
|
|
79
|
+
bold.
|
|
80
|
+
- A code fence keeps its language, and a `|` inside code in a table cell no
|
|
81
|
+
longer splits the row.
|
|
82
|
+
- A long body converts in linear time, and a body nested deeper than the
|
|
83
|
+
stack is read as its text instead of raising.
|
|
84
|
+
|
|
85
|
+
### Known limitations
|
|
86
|
+
|
|
87
|
+
- A Markdown table needs a header row and the same number of cells in every
|
|
88
|
+
row. A header-less HTML table gains an empty header row, and a row that
|
|
89
|
+
spans the table gains empty cells.
|
|
90
|
+
- Struck-through text is kept as raw `<s>`, since CommonMark has no
|
|
91
|
+
strikethrough.
|
|
92
|
+
- Literal text that looks like syntax is sometimes escaped where
|
|
93
|
+
CommonMark would not need it, for example `5\*3` or `x \<= y`. It
|
|
94
|
+
displays as typed.
|
|
95
|
+
|
|
96
|
+
## 0.5.0 — 2026-09-08
|
|
97
|
+
|
|
98
|
+
### Fixed
|
|
99
|
+
|
|
100
|
+
- **Deeply nested HTML raised `RecursionError` while a model was being
|
|
101
|
+
validated.** `markdownify` walks the parsed document recursively and
|
|
102
|
+
spends about two CPython frames per nesting level, so roughly 494 levels
|
|
103
|
+
exhausted the default 1000-frame limit — measured, and the same 494 for
|
|
104
|
+
`<div>`, `<p>`, `<blockquote>` and `<table><tr><td>`, 495 for
|
|
105
|
+
`<ul><li>`, which is what identifies the cost as per-level. An
|
|
106
|
+
unclosed tag counts too: `html.parser` does not auto-close `<p>` or
|
|
107
|
+
`<li>`, so `"<p>" * 5000` really is 5000 levels.
|
|
108
|
+
|
|
109
|
+
Because the converter was wired as a Pydantic `BeforeValidator`, the
|
|
110
|
+
failure landed inside `model_validate` — that is, inside `get_ticket` —
|
|
111
|
+
as a bare builtin from a library whose whole error surface is supposed
|
|
112
|
+
to derive from `GlpiError`.
|
|
113
|
+
|
|
114
|
+
`from_transport` now *attempts* the conversion and answers the
|
|
115
|
+
`RecursionError` by stripping the document to its text instead.
|
|
116
|
+
**It degrades, it never truncates, and it does not raise for depth**:
|
|
117
|
+
every character of prose the converting path would have produced also
|
|
118
|
+
appears in the degraded rendering.
|
|
119
|
+
|
|
120
|
+
Attempting it rather than predicting it is the whole design, and it
|
|
121
|
+
replaced a fixed `MAX_HTML_DEPTH = 200` bound that was wrong in both
|
|
122
|
+
directions. Too low, because the budget is not 1000 frames but whatever
|
|
123
|
+
is left of the stack when the conversion starts, and that belongs to
|
|
124
|
+
the caller — so the bound had to assume the worst and flattened every
|
|
125
|
+
body between 200 and the real cliff of about 494. Measured, a
|
|
126
|
+
300-level and a 400-level body now come back as **Markdown with their
|
|
127
|
+
links, emphasis and lists intact** where they used to come back as
|
|
128
|
+
plain text, with no error to notice and no way to ask for better. And
|
|
129
|
+
too fragile, because predicting the depth meant reproducing the
|
|
130
|
+
parser's idea of the tree: three rounds of adversarial review found
|
|
131
|
+
seven ways for that estimate to land *under* the real depth, each of
|
|
132
|
+
which sent a document to `markdownify` and into the very
|
|
133
|
+
`RecursionError` the bound existed to prevent.
|
|
134
|
+
|
|
135
|
+
Trying the conversion cannot be wrong about whether the conversion
|
|
136
|
+
fits. `MAX_HTML_DEPTH` and the scan behind it are gone; the constant
|
|
137
|
+
was introduced in this same unreleased cycle and never shipped.
|
|
138
|
+
|
|
139
|
+
Two consequences worth knowing. The outcome now depends on the caller's
|
|
140
|
+
remaining stack, so the same body can convert from one call site and
|
|
141
|
+
degrade from a deeper one — nothing is lost either way, but a caller
|
|
142
|
+
comparing two renderings of one body should know which knob moved it.
|
|
143
|
+
And a body too deep to convert now pays the failed attempt before it
|
|
144
|
+
degrades: measured, 2.0x to 2.6x the old cost at 600 and 5000 levels.
|
|
145
|
+
Ordinary bodies got *faster*, at 0.87x to 0.90x, because the scan they
|
|
146
|
+
used to pay for on every read is gone.
|
|
147
|
+
|
|
148
|
+
A document `html.parser` refuses outright — `<.
|
|
|
34
478
|
database; without it `zoneinfo` resolves on Linux CI and raises on a
|
|
35
479
|
developer machine.
|
|
36
480
|
|
|
481
|
+
- **`changed_since` no longer assumes UTC.** An aware `datetime` now needs the
|
|
482
|
+
server's timezone and raises `GlpiValidationError` without it:
|
|
483
|
+
|
|
484
|
+
```python
|
|
485
|
+
window = changed_since(last_run, tz=client.server_timezone)
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
The bound this builds is compared against a naive server-local column, so
|
|
489
|
+
converting the caller's moment to UTC asked the server for a different one.
|
|
490
|
+
A 09:33 Paris timestamp became a `07:33` filter. East of UTC that only
|
|
491
|
+
re-reads a few hours on every sweep; west of it the bound moves *forward*
|
|
492
|
+
and modifications are skipped outright — four hours in New York, seven in
|
|
493
|
+
Los Angeles — and the size of the drift changes at each DST transition, so
|
|
494
|
+
a sync that looks correct in January starts losing rows in March.
|
|
495
|
+
|
|
496
|
+
The offset is now spent converting the value onto the server's clock and
|
|
497
|
+
then dropped, which is what the model serialiser already does on the way
|
|
498
|
+
out; the two halves had diverged by exactly the offset. Missing `tz` is
|
|
499
|
+
refused rather than defaulted for the same reason `server_timezone` has no
|
|
500
|
+
default: every guess is wrong somewhere, and being wrong here returns a
|
|
501
|
+
short result set rather than an error.
|
|
502
|
+
|
|
503
|
+
A `date`, an ISO string, or a naive `datetime` is unaffected and needs no
|
|
504
|
+
`tz` — a naive value already means the server's clock.
|
|
505
|
+
|
|
37
506
|
- **Search endpoints now raise on a 4xx instead of returning `[]`.** The seven
|
|
38
507
|
`search_*` helpers passed no `failure_message` to `_resource_list`, which
|
|
39
508
|
skipped the status check entirely, so a 400, 401, 403 or 404 came back as an
|
|
@@ -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.0
|
|
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>=3.
|
|
31
|
-
Requires-Dist: markdownify>=
|
|
30
|
+
Requires-Dist: markdown-it-py>=3.0
|
|
31
|
+
Requires-Dist: markdownify>=1.2
|
|
32
|
+
Requires-Dist: mdformat-tables>=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.
|
|
@@ -70,7 +69,11 @@ The goal is to let GLPI integrations work with domain objects instead of raw
|
|
|
70
69
|
JSON payloads. The package exposes Pydantic models for tickets, users,
|
|
71
70
|
followups, documents, locations, and related records, while converting GLPI
|
|
72
71
|
HTML content into Markdown for Python-side workflows and rendering Markdown
|
|
73
|
-
back to HTML for outgoing payloads.
|
|
72
|
+
back to HTML for outgoing payloads. On a response model that conversion is
|
|
73
|
+
lazy — `.content` converts on first read and caches, so listing records
|
|
74
|
+
costs nothing per body — and it degrades to plain text rather than failing
|
|
75
|
+
on pathologically nested HTML. See
|
|
76
|
+
[Rich-text content](https://glpi-python-client.readthedocs.io/en/latest/user_guide.html#content-conversion).
|
|
74
77
|
|
|
75
78
|
It currently focuses on ticket-centric workflows and exposes two high-level
|
|
76
79
|
clients built on top of the GLPI v2 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.
|
|
@@ -12,7 +12,11 @@ The goal is to let GLPI integrations work with domain objects instead of raw
|
|
|
12
12
|
JSON payloads. The package exposes Pydantic models for tickets, users,
|
|
13
13
|
followups, documents, locations, and related records, while converting GLPI
|
|
14
14
|
HTML content into Markdown for Python-side workflows and rendering Markdown
|
|
15
|
-
back to HTML for outgoing payloads.
|
|
15
|
+
back to HTML for outgoing payloads. On a response model that conversion is
|
|
16
|
+
lazy — `.content` converts on first read and caches, so listing records
|
|
17
|
+
costs nothing per body — and it degrades to plain text rather than failing
|
|
18
|
+
on pathologically nested HTML. See
|
|
19
|
+
[Rich-text content](https://glpi-python-client.readthedocs.io/en/latest/user_guide.html#content-conversion).
|
|
16
20
|
|
|
17
21
|
It currently focuses on ticket-centric workflows and exposes two high-level
|
|
18
22
|
clients built on top of the GLPI v2 REST API:
|