glpi-python-client 0.1.0__py3-none-any.whl

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 (98) hide show
  1. glpi_python_client/__init__.py +36 -0
  2. glpi_python_client/auth/__init__.py +11 -0
  3. glpi_python_client/auth/auth.py +310 -0
  4. glpi_python_client/auth/tests/test_auth.py +189 -0
  5. glpi_python_client/clients/__init__.py +18 -0
  6. glpi_python_client/clients/api_v1_session.py +460 -0
  7. glpi_python_client/clients/api_v2_client.py +317 -0
  8. glpi_python_client/clients/async_api_v2_client.py +236 -0
  9. glpi_python_client/clients/tests/__init__.py +5 -0
  10. glpi_python_client/clients/tests/test_api_v1_session.py +85 -0
  11. glpi_python_client/clients/tests/test_api_v2_client.py +349 -0
  12. glpi_python_client/clients/tests/test_async_api_v2_client.py +257 -0
  13. glpi_python_client/clients/v2/__init__.py +8 -0
  14. glpi_python_client/clients/v2/async_/__init__.py +12 -0
  15. glpi_python_client/clients/v2/async_/api.py +29 -0
  16. glpi_python_client/clients/v2/async_/directory.py +88 -0
  17. glpi_python_client/clients/v2/async_/documents.py +144 -0
  18. glpi_python_client/clients/v2/async_/team.py +125 -0
  19. glpi_python_client/clients/v2/async_/tests/__init__.py +5 -0
  20. glpi_python_client/clients/v2/async_/tests/test_directory.py +43 -0
  21. glpi_python_client/clients/v2/async_/tests/test_documents.py +41 -0
  22. glpi_python_client/clients/v2/async_/tests/test_team.py +44 -0
  23. glpi_python_client/clients/v2/async_/tests/test_tickets.py +174 -0
  24. glpi_python_client/clients/v2/async_/tests/test_timeline.py +126 -0
  25. glpi_python_client/clients/v2/async_/tickets.py +312 -0
  26. glpi_python_client/clients/v2/async_/timeline.py +312 -0
  27. glpi_python_client/clients/v2/async_/transport.py +251 -0
  28. glpi_python_client/clients/v2/common/__init__.py +6 -0
  29. glpi_python_client/clients/v2/common/client_config.py +219 -0
  30. glpi_python_client/clients/v2/common/constants.py +45 -0
  31. glpi_python_client/clients/v2/common/errors.py +23 -0
  32. glpi_python_client/clients/v2/common/filters.py +30 -0
  33. glpi_python_client/clients/v2/common/payloads.py +57 -0
  34. glpi_python_client/clients/v2/common/request_http.py +195 -0
  35. glpi_python_client/clients/v2/common/response_payloads.py +76 -0
  36. glpi_python_client/clients/v2/common/ticket_search.py +113 -0
  37. glpi_python_client/clients/v2/sync/__init__.py +12 -0
  38. glpi_python_client/clients/v2/sync/api.py +29 -0
  39. glpi_python_client/clients/v2/sync/directory.py +90 -0
  40. glpi_python_client/clients/v2/sync/documents.py +144 -0
  41. glpi_python_client/clients/v2/sync/team.py +125 -0
  42. glpi_python_client/clients/v2/sync/tests/__init__.py +5 -0
  43. glpi_python_client/clients/v2/sync/tests/test_directory.py +57 -0
  44. glpi_python_client/clients/v2/sync/tests/test_documents.py +99 -0
  45. glpi_python_client/clients/v2/sync/tests/test_team.py +64 -0
  46. glpi_python_client/clients/v2/sync/tests/test_tickets.py +430 -0
  47. glpi_python_client/clients/v2/sync/tests/test_timeline.py +77 -0
  48. glpi_python_client/clients/v2/sync/tests/test_transport.py +89 -0
  49. glpi_python_client/clients/v2/sync/tickets.py +312 -0
  50. glpi_python_client/clients/v2/sync/timeline.py +308 -0
  51. glpi_python_client/clients/v2/sync/transport.py +246 -0
  52. glpi_python_client/content/__init__.py +11 -0
  53. glpi_python_client/content/conversion.py +58 -0
  54. glpi_python_client/content/records/__init__.py +84 -0
  55. glpi_python_client/content/records/core/__init__.py +6 -0
  56. glpi_python_client/content/records/core/document_links.py +100 -0
  57. glpi_python_client/content/records/core/normalization.py +53 -0
  58. glpi_python_client/content/records/core/references.py +98 -0
  59. glpi_python_client/content/records/core/scalars.py +83 -0
  60. glpi_python_client/content/records/parsers/__init__.py +6 -0
  61. glpi_python_client/content/records/parsers/directory.py +62 -0
  62. glpi_python_client/content/records/parsers/documents.py +49 -0
  63. glpi_python_client/content/records/parsers/team.py +58 -0
  64. glpi_python_client/content/records/parsers/tests/__init__.py +5 -0
  65. glpi_python_client/content/records/parsers/tests/test_tickets.py +35 -0
  66. glpi_python_client/content/records/parsers/tests/test_timeline.py +20 -0
  67. glpi_python_client/content/records/parsers/tickets.py +96 -0
  68. glpi_python_client/content/records/parsers/timeline.py +119 -0
  69. glpi_python_client/content/tests/__init__.py +5 -0
  70. glpi_python_client/content/tests/test_conversion.py +13 -0
  71. glpi_python_client/models/__init__.py +30 -0
  72. glpi_python_client/models/_base.py +22 -0
  73. glpi_python_client/models/_payload.py +79 -0
  74. glpi_python_client/models/_shared.py +37 -0
  75. glpi_python_client/models/glpi/__init__.py +27 -0
  76. glpi_python_client/models/glpi/_document.py +59 -0
  77. glpi_python_client/models/glpi/_followup.py +77 -0
  78. glpi_python_client/models/glpi/_location.py +53 -0
  79. glpi_python_client/models/glpi/_solution.py +57 -0
  80. glpi_python_client/models/glpi/_task.py +41 -0
  81. glpi_python_client/models/glpi/_team_member.py +33 -0
  82. glpi_python_client/models/glpi/_ticket.py +303 -0
  83. glpi_python_client/models/glpi/_user.py +92 -0
  84. glpi_python_client/models/glpi/tests/__init__.py +5 -0
  85. glpi_python_client/models/glpi/tests/test__document.py +12 -0
  86. glpi_python_client/models/glpi/tests/test__followup.py +31 -0
  87. glpi_python_client/models/glpi/tests/test__location.py +12 -0
  88. glpi_python_client/models/glpi/tests/test__solution.py +11 -0
  89. glpi_python_client/models/glpi/tests/test__ticket.py +59 -0
  90. glpi_python_client/models/glpi/tests/test__user.py +29 -0
  91. glpi_python_client/py.typed +0 -0
  92. glpi_python_client/testing/__init__.py +27 -0
  93. glpi_python_client/testing/fixtures.py +52 -0
  94. glpi_python_client/testing/utils.py +149 -0
  95. glpi_python_client-0.1.0.dist-info/METADATA +144 -0
  96. glpi_python_client-0.1.0.dist-info/RECORD +98 -0
  97. glpi_python_client-0.1.0.dist-info/WHEEL +4 -0
  98. glpi_python_client-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,149 @@
1
+ """Reusable test utility builders for glpi_python_client.
2
+
3
+ This module keeps fake responses and representative payload builders in one
4
+ place so unit tests can share realistic fixtures without repeating setup.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from typing import Any
10
+
11
+ from glpi_python_client import GlpiClient
12
+
13
+ _DEFAULT_CLIENT_CONFIG: dict[str, object] = {
14
+ "glpi_api_url": "https://glpi.example.test/api.php/",
15
+ "client_id": "client-id",
16
+ "client_secret": "client-secret",
17
+ "username": "api-user",
18
+ "password": "api-password",
19
+ }
20
+
21
+
22
+ class FakeResponse:
23
+ """Small ``requests.Response`` stand-in for unit tests.
24
+
25
+ The fake object implements only the attributes and ``json()`` behavior used
26
+ by the package's tests.
27
+ """
28
+
29
+ def __init__(
30
+ self,
31
+ status_code: int = 201,
32
+ payload: object | None = None,
33
+ *,
34
+ headers: dict[str, str] | None = None,
35
+ text: str | None = None,
36
+ content: bytes | None = None,
37
+ ) -> None:
38
+ self.status_code = status_code
39
+ self._payload = {"id": "321"} if payload is None else payload
40
+ self.headers = headers or {}
41
+ self.text = str(self._payload) if text is None else text
42
+ self.content = self.text.encode() if content is None else content
43
+
44
+ def json(self) -> Any:
45
+ return self._payload
46
+
47
+
48
+ class SearchResponse(FakeResponse):
49
+ """Fake GLPI list or search response used by tests.
50
+
51
+ This specialization mainly exists to make test intent clearer at call
52
+ sites.
53
+ """
54
+
55
+ def __init__(
56
+ self,
57
+ payload: list[dict[str, Any]],
58
+ *,
59
+ status_code: int = 200,
60
+ headers: dict[str, str] | None = None,
61
+ ) -> None:
62
+ super().__init__(status_code=status_code, payload=payload, headers=headers)
63
+
64
+
65
+ class TicketResponse(FakeResponse):
66
+ """Fake GLPI single-ticket response used by tests.
67
+
68
+ The subclass documents that the payload shape represents one ticket record
69
+ rather than a list response.
70
+ """
71
+
72
+ def __init__(
73
+ self,
74
+ payload: dict[str, Any],
75
+ *,
76
+ status_code: int = 200,
77
+ ) -> None:
78
+ super().__init__(status_code=status_code, payload=payload)
79
+
80
+
81
+ class TokenResponse(FakeResponse):
82
+ """Fake OAuth token response used by tests.
83
+
84
+ By default it returns a minimal successful token payload suitable for token
85
+ acquisition and refresh tests.
86
+ """
87
+
88
+ def __init__(
89
+ self,
90
+ status_code: int = 200,
91
+ payload: dict[str, Any] | None = None,
92
+ ) -> None:
93
+ super().__init__(
94
+ status_code=status_code,
95
+ payload=payload or {"access_token": "token", "expires_in": 3600},
96
+ )
97
+
98
+
99
+ def make_client(**overrides: object) -> GlpiClient:
100
+ """Return a test client configured with sensible defaults.
101
+
102
+ Callers can override any constructor keyword while reusing the shared base
103
+ configuration needed by most tests.
104
+ """
105
+
106
+ config = dict(_DEFAULT_CLIENT_CONFIG)
107
+ config.update(overrides)
108
+ return GlpiClient(**config) # type: ignore[arg-type]
109
+
110
+
111
+ def make_followup_record(**overrides: object) -> dict[str, Any]:
112
+ """Return a representative raw GLPI followup payload.
113
+
114
+ The payload includes attachment references so content and document-link
115
+ parsing tests can exercise both code paths.
116
+ """
117
+
118
+ payload: dict[str, Any] = {
119
+ "id": 12,
120
+ "content": (
121
+ "<p>Hello</p>"
122
+ '<a href="/front/document.send.php?docid=45">attachment</a>'
123
+ '<img src="/front/document.send.php?docid=46" />'
124
+ ),
125
+ "users_id": 5,
126
+ "is_private": "1",
127
+ }
128
+ payload.update(overrides)
129
+ return payload
130
+
131
+
132
+ def make_ticket_record(**overrides: object) -> dict[str, Any]:
133
+ """Return a representative raw GLPI ticket payload.
134
+
135
+ The payload captures the common ticket fields needed by parsing and client
136
+ behavior tests while still allowing targeted overrides.
137
+ """
138
+
139
+ payload: dict[str, Any] = {
140
+ "id": 123,
141
+ "name": "Need help",
142
+ "content": "<p>Body with <strong>formatting</strong></p>",
143
+ "status": {"id": 2, "name": "Processing"},
144
+ "entity": {"id": 7, "name": "Root"},
145
+ "location": {"id": 8, "name": "Paris"},
146
+ "user_recipient": {"id": 9, "name": "Requester"},
147
+ }
148
+ payload.update(overrides)
149
+ return payload
@@ -0,0 +1,144 @@
1
+ Metadata-Version: 2.4
2
+ Name: glpi-python-client
3
+ Version: 0.1.0
4
+ Summary: A typed Python client for GLPI ITSM APIs.
5
+ Project-URL: Homepage, https://github.com/baraline/glpi_python_client
6
+ Project-URL: Documentation, https://glpi-python-client.readthedocs.io/en/latest/
7
+ Project-URL: Issues, https://github.com/baraline/glpi_python_client/issues
8
+ Project-URL: Source, https://github.com/baraline/glpi_python_client
9
+ Author: glpi-python-client contributors
10
+ License: MIT
11
+ License-File: LICENSE
12
+ Keywords: api,client,glpi,itsm
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Topic :: Internet :: WWW/HTTP
23
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
+ Classifier: Typing :: Typed
25
+ Requires-Python: >=3.10
26
+ Requires-Dist: beautifulsoup4>=4.12
27
+ Requires-Dist: lxml>=4.9
28
+ Requires-Dist: markdown>=3.6
29
+ Requires-Dist: markdownify>=0.13
30
+ Requires-Dist: pydantic>=2.8
31
+ Requires-Dist: requests>=2.31
32
+ Requires-Dist: tenacity>=8.2
33
+ Requires-Dist: urllib3>=2.0
34
+ Provides-Extra: dev
35
+ Requires-Dist: build>=1.2; extra == 'dev'
36
+ Requires-Dist: mypy>=1.11; extra == 'dev'
37
+ Requires-Dist: numpydoc>=1.8; extra == 'dev'
38
+ Requires-Dist: pytest>=8.0; extra == 'dev'
39
+ Requires-Dist: ruff>=0.6; extra == 'dev'
40
+ Requires-Dist: sphinx-rtd-theme>=2.0; extra == 'dev'
41
+ Requires-Dist: sphinx<8.2,>=7.2; extra == 'dev'
42
+ Requires-Dist: tomli>=2.0; (python_version < '3.11') and extra == 'dev'
43
+ Requires-Dist: twine>=5.1; extra == 'dev'
44
+ Requires-Dist: types-requests>=2.32; extra == 'dev'
45
+ Requires-Dist: vulture>=2.11; extra == 'dev'
46
+ Provides-Extra: docs
47
+ Requires-Dist: numpydoc>=1.8; extra == 'docs'
48
+ Requires-Dist: sphinx-rtd-theme>=2.0; extra == 'docs'
49
+ Requires-Dist: sphinx<8.2,>=7.2; extra == 'docs'
50
+ Requires-Dist: tomli>=2.0; (python_version < '3.11') and extra == 'docs'
51
+ Description-Content-Type: text/markdown
52
+
53
+ # glpi-python-client
54
+
55
+ [![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)
56
+ [![License](https://img.shields.io/github/license/baraline/glpi_python_client)](LICENSE)
57
+ [![Python](https://img.shields.io/badge/python-3.10%2B-blue)](https://github.com/baraline/glpi_python_client)
58
+ [![Docs](https://readthedocs.org/projects/glpi-python-client/badge/?version=latest)](https://glpi-python-client.readthedocs.io/en/latest/)
59
+
60
+ `glpi-python-client` is a typed Python client for GLPI ITSM APIs.
61
+
62
+ The goal is to let GLPI integrations work with domain objects instead of raw
63
+ JSON payloads. The package exposes Pydantic models for tickets, users,
64
+ followups, documents, locations, and related records, while converting GLPI
65
+ HTML content into Markdown for Python-side workflows and rendering Markdown
66
+ back to HTML for outgoing payloads.
67
+
68
+ It currently focuses on ticket-centric workflows and exposes matching sync and
69
+ async high-level clients.
70
+
71
+ ## Installation
72
+
73
+ ```bash
74
+ pip install glpi-python-client
75
+ ```
76
+
77
+ For local development:
78
+
79
+ ```bash
80
+ python -m pip install -e .[dev]
81
+ python -m pytest
82
+ ```
83
+
84
+ ## Quick Start
85
+
86
+ Create a client with your GLPI API URL and at least one complete auth pair:
87
+
88
+ - `client_id` and `client_secret`
89
+ - `username` and `password`
90
+ - both pairs together
91
+
92
+ ```python
93
+ from glpi_python_client import GlpiClient, GlpiTicket
94
+
95
+ with GlpiClient(
96
+ glpi_api_url="https://glpi.example.com/api.php",
97
+ client_id="oauth-client-id",
98
+ client_secret="oauth-client-secret",
99
+ username="api-user",
100
+ password="api-password",
101
+ ) as glpi:
102
+ ticket_id = glpi.create_ticket(
103
+ GlpiTicket(
104
+ name="Printer issue",
105
+ content="The printer is not reachable from the office network.",
106
+ urgency=3,
107
+ impact=3,
108
+ )
109
+ )
110
+ ticket = glpi.get_ticket_record(ticket_id)
111
+
112
+ print(ticket.id)
113
+ print(ticket.content)
114
+ ```
115
+
116
+ Async code uses the same model layer and nearly the same API surface:
117
+
118
+ ```python
119
+ from glpi_python_client import AsyncGlpiClient
120
+
121
+ async with AsyncGlpiClient(
122
+ glpi_api_url="https://glpi.example.com/api.php",
123
+ client_id="oauth-client-id",
124
+ client_secret="oauth-client-secret",
125
+ ) as glpi:
126
+ tickets = await glpi.search_ticket_records(query='status.id=in=(1,2)')
127
+ ```
128
+
129
+ If your application already provides `GLPI_` environment variables,
130
+ `GlpiClient.from_env()` and `AsyncGlpiClient.from_env()` are also available.
131
+
132
+ ## Documentation
133
+
134
+ - [Hosted documentation](https://glpi-python-client.readthedocs.io/en/latest/)
135
+ - [API reference](https://glpi-python-client.readthedocs.io/en/latest/api_reference.html)
136
+ - [Installation guide](https://glpi-python-client.readthedocs.io/en/latest/installation.html)
137
+ - [Development guide](https://glpi-python-client.readthedocs.io/en/latest/development_rtd.html)
138
+
139
+ To build the Sphinx documentation locally:
140
+
141
+ ```bash
142
+ python -m pip install -e .[docs]
143
+ python -m sphinx -b html docs docs/_build/html
144
+ ```
@@ -0,0 +1,98 @@
1
+ glpi_python_client/__init__.py,sha256=e6o4PUSnkgZL-QOIn4enVG9c6SWulbkT1m4_49wHEro,779
2
+ glpi_python_client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ glpi_python_client/auth/__init__.py,sha256=KjIoBRnelLjeOboDuGJISPdlfMITLRBJMIy6P0gWfFY,345
4
+ glpi_python_client/auth/auth.py,sha256=0LsZDVE1gNv8hCv50TjU5BxIX5Nl5jGh_D_lK9p7G6A,10471
5
+ glpi_python_client/auth/tests/test_auth.py,sha256=hMyRwtL-A-mpOGz8OHEOZJCdzuOXMRS_rpDoqhdeEdg,6044
6
+ glpi_python_client/clients/__init__.py,sha256=W9-tNPJNDGlcQxN8J5rYtVhLQeDhMyBESOR8sy3aLxc,564
7
+ glpi_python_client/clients/api_v1_session.py,sha256=R2clMk9lXqyipd2P6N5iJh_AL7PuZwJAePTnMM5g8GY,13801
8
+ glpi_python_client/clients/api_v2_client.py,sha256=F0d1RxW0Tfsqh6MrMxLqwI0RgzirtuofJqVJD6u-WRU,10883
9
+ glpi_python_client/clients/async_api_v2_client.py,sha256=JAHbInlbxuEAsc7ll6hp2WQPJldyJ9obgWk5gXg--e4,7714
10
+ glpi_python_client/clients/tests/__init__.py,sha256=lk2hzstOPqFtsx0IoLPxGPOwDTq9-iR8eJykNJtC-Tw,212
11
+ glpi_python_client/clients/tests/test_api_v1_session.py,sha256=gcwp01ny5XVJhJzx9dPG5d9t8T3O_fX9LgL49RAOZdc,2336
12
+ glpi_python_client/clients/tests/test_api_v2_client.py,sha256=4cmdqIQqpeGqbqazmKO93iZvTlutFgmaNWag-aMYibI,10872
13
+ glpi_python_client/clients/tests/test_async_api_v2_client.py,sha256=Ee3SKTsTh1e8LTK1BJWauiL5YLtYMENB6y0xWnS16s4,8506
14
+ glpi_python_client/clients/v2/__init__.py,sha256=D0NHFjd4WTqRG19y9yV3JQ3LxuNDVBSSJYob3qfg5nA,261
15
+ glpi_python_client/clients/v2/async_/__init__.py,sha256=G7tHeB5sDEe4e5rODcAkHaJCTy0J_Y-lfvpy1621h6o,360
16
+ glpi_python_client/clients/v2/async_/api.py,sha256=rjIXltHy1SYpdXhZXdMYZEcSFb05rdsQ9f7r_OkFSBI,825
17
+ glpi_python_client/clients/v2/async_/directory.py,sha256=5mfd7nP-zmWVdJywbTreHab-nHf62gzDmwnVD_Kiw9Q,3020
18
+ glpi_python_client/clients/v2/async_/documents.py,sha256=SMGyZN00NKsBhF-uhe-4VA6sBECxgvxORfZqvlS2D-Y,5244
19
+ glpi_python_client/clients/v2/async_/team.py,sha256=BdSrMSKxsrt7BCOg-65eoE-dkRGakokbv_36inx0vBI,4220
20
+ glpi_python_client/clients/v2/async_/tickets.py,sha256=S4H9zDXtZrSyYgxCwPuFKv271JxwFBBtHDjxyZpXIyc,10482
21
+ glpi_python_client/clients/v2/async_/timeline.py,sha256=kNiia7P9wh6onh9HAqvloavYKBiFo0Xfk3rXAiLbp_U,11066
22
+ glpi_python_client/clients/v2/async_/transport.py,sha256=eB3TX3oWw1WvKs-Nr1xincyyPSa50qMCF0-TiVcRfbA,7897
23
+ glpi_python_client/clients/v2/async_/tests/__init__.py,sha256=ZlT4PuHociuJHMuYpESFOZELcGlbLx_NtO9DVtLGdDM,217
24
+ glpi_python_client/clients/v2/async_/tests/test_directory.py,sha256=VXvpuXSGvTNru9Cvre68Zvr-PZWUU-KJMknK-Km7QXQ,1300
25
+ glpi_python_client/clients/v2/async_/tests/test_documents.py,sha256=baPVTMtu4Uw1QA4eFkGRV3sPE_jsYsyNwdOoAMnIT9E,1172
26
+ glpi_python_client/clients/v2/async_/tests/test_team.py,sha256=qyd64byyPpIz_ZKSLXPQIqFza10r-6bwtWKjuduOEqs,1346
27
+ glpi_python_client/clients/v2/async_/tests/test_tickets.py,sha256=qJ-vmxqAKUnXQZApYuX6iqcWgC-JISyElA5iOQaupjQ,5429
28
+ glpi_python_client/clients/v2/async_/tests/test_timeline.py,sha256=0h7x_Mfp93SMkUgZbzli8mJEDN2MveI3sBAGzclc-ag,3943
29
+ glpi_python_client/clients/v2/common/__init__.py,sha256=F-S8xh0bzkIHZr_0NFE0i6xBYHwd6JRVRb2wDjmu5j0,267
30
+ glpi_python_client/clients/v2/common/client_config.py,sha256=GYkcrL9yfnMNBAOkSx-opltFkTPjwS6QRIvqaMSaaTQ,7057
31
+ glpi_python_client/clients/v2/common/constants.py,sha256=kGs9rvAQG9GGWAGBdel4VhEBv83M9Pw5t4svH5YFqOA,1037
32
+ glpi_python_client/clients/v2/common/errors.py,sha256=oH_ztJjF6zt7OuF21DE3JCeC3mKSPgDsx0ihPJ4hPbs,759
33
+ glpi_python_client/clients/v2/common/filters.py,sha256=lQXoZRTeGAEmIRe7OeYpZQOCR89l0J3WFj4eNcEB_qU,1004
34
+ glpi_python_client/clients/v2/common/payloads.py,sha256=guVkDAOeuHY1PoDrJSOFBRl8RwzN2c_8xsiILgtyFVw,1727
35
+ glpi_python_client/clients/v2/common/request_http.py,sha256=I89A7NVq1MZKqQIAK-iRb8-RvYe_mc-lB0bJ-ObkSUQ,6041
36
+ glpi_python_client/clients/v2/common/response_payloads.py,sha256=THJzwBTQLK8Dbdt6lLQ184r1xqQeeSCV_Qb18iC-ZKM,2285
37
+ glpi_python_client/clients/v2/common/ticket_search.py,sha256=WGoKSw19fIgUTsfl8B6RjxpsGaF_4fAg4IS79_yrcW0,3527
38
+ glpi_python_client/clients/v2/sync/__init__.py,sha256=GvGYb4T4ArFAxu5dgoVaLBtL-MwBpzZKWNFMbARlDuY,347
39
+ glpi_python_client/clients/v2/sync/api.py,sha256=GqdvXeQUWxslGUcONyoRpCTO8Rfc0hX3pomYGDs9Y0Q,828
40
+ glpi_python_client/clients/v2/sync/directory.py,sha256=lHzsWoV3pAwx6WVnOcPRU8xIhhMpa28p3Bdm2ZnSYEo,3111
41
+ glpi_python_client/clients/v2/sync/documents.py,sha256=3MuRjj3KMVBE8vnLlCz-OtiGIpij7PCRDBQ-FIJcte4,5210
42
+ glpi_python_client/clients/v2/sync/team.py,sha256=HtMmhdX7o-uJm7v6HDanThRqjOD3T6RuWkdWYSq53BI,4159
43
+ glpi_python_client/clients/v2/sync/tickets.py,sha256=Jl3V3LFX6mnl2zOxECLXNlGYOVzT7gkUfWxkJaP793s,10325
44
+ glpi_python_client/clients/v2/sync/timeline.py,sha256=4N9sZJsvuGkdh5_IxsOzipDlfEAvKCyeM02TEt4K9mE,10818
45
+ glpi_python_client/clients/v2/sync/transport.py,sha256=ykJZqNzDZYN2N_1hefoOUuNOHbpNevfEc0kVMsz-w4w,7597
46
+ glpi_python_client/clients/v2/sync/tests/__init__.py,sha256=wYz86iX0qRmE4JsogEszfRKhVrzrucYMPgkReAUQ8Jk,199
47
+ glpi_python_client/clients/v2/sync/tests/test_directory.py,sha256=7-RRXYiOwAYf4pEYZBEYhkBIGLFt6ZwOFwQj8XSD-Ek,1627
48
+ glpi_python_client/clients/v2/sync/tests/test_documents.py,sha256=rvkxjV89W3rSNj30WPVtazkVEWX1RayfJ1knZjhvNOc,3262
49
+ glpi_python_client/clients/v2/sync/tests/test_team.py,sha256=2mMU1uqbczNyhqUvJV1l3sJgYQqGB_7bOCPJjRIcEtk,1866
50
+ glpi_python_client/clients/v2/sync/tests/test_tickets.py,sha256=LV1TaLR1pPR2Jhqlz_EPkwTxfXVRT8EZrwUIjsfCkP0,12924
51
+ glpi_python_client/clients/v2/sync/tests/test_timeline.py,sha256=e5I44VInNWuaqAtxeQpeKQr0Z6rg-B1t5e4Pjfsxumg,2235
52
+ glpi_python_client/clients/v2/sync/tests/test_transport.py,sha256=aGq7Nr0XGeFTKzouk72L3neo-iK7xwHkXDmDGG69cjo,2852
53
+ glpi_python_client/content/__init__.py,sha256=3H4IbrNhgFO0BJrc0xLoeXrFHUE1nqOaDlNgi2MtK9k,365
54
+ glpi_python_client/content/conversion.py,sha256=iqmiy0m9yyUD9Bw9to5AEMe0WO5LiIzbWuOEcCRXjyU,1852
55
+ glpi_python_client/content/records/__init__.py,sha256=iDHsvtvZdOknlcSUfOPRp7Ob5xSrOfOahu3gpuMUuw4,2462
56
+ glpi_python_client/content/records/core/__init__.py,sha256=jx4NnwYVJhM5AID6KKPczKs8_bcwggRSqwbaETzqx7o,220
57
+ glpi_python_client/content/records/core/document_links.py,sha256=697XIJYpLCB7eCx6dH27ldClDdeAuEilwk6Js1ijSnY,3740
58
+ glpi_python_client/content/records/core/normalization.py,sha256=knCtaOUUBtOXrGiulucLptO9DJb8_p7-b5ptF3WyUZM,1667
59
+ glpi_python_client/content/records/core/references.py,sha256=V-AmOTs73_JXPNUXkP3LzVRMptekBDVE09cXNBRAS7o,3116
60
+ glpi_python_client/content/records/core/scalars.py,sha256=EOyVl3qpJsp35iHiOc7ls4utC7yUixsUSIQ1UEqHoUE,2386
61
+ glpi_python_client/content/records/parsers/__init__.py,sha256=mWydfj2qLc6nYcZBABUX_wbGABmWXXEbxXNZ6d01Iqk,224
62
+ glpi_python_client/content/records/parsers/directory.py,sha256=egsf0gvU7ujEpOa4CseHKwyrq5tYrxvOU52GhsDa9ZU,2221
63
+ glpi_python_client/content/records/parsers/documents.py,sha256=zURfvAIP-Cd4Xqtd9nwhjxpjjU2CzZ5PSmtxMoBlB9Y,1676
64
+ glpi_python_client/content/records/parsers/team.py,sha256=a2C1GoboZi7Ii2gw1DhggVEC81lWwYzkkmMlM9WAd7U,2002
65
+ glpi_python_client/content/records/parsers/tickets.py,sha256=1FkLon1rqsDbzmtzYloBd8SKEMY6g7Q8P3GF2an-4aQ,3626
66
+ glpi_python_client/content/records/parsers/timeline.py,sha256=42_inUv38I70jpa_z76LxhsOxcg5tRClZFEMVdYsdkA,4715
67
+ glpi_python_client/content/records/parsers/tests/__init__.py,sha256=QEVA2HGrIodHyGIfN8LYwjscLrvujw2GyKg5WMZFIGY,190
68
+ glpi_python_client/content/records/parsers/tests/test_tickets.py,sha256=hnE1T-rMueLmdhdrGT_K_hlhiH2hpHaSwq-n0sw_bII,1073
69
+ glpi_python_client/content/records/parsers/tests/test_timeline.py,sha256=vUNHOgiLZAjNNpHTJCaEhMsqNUesqZk8aHZ2TgTXfNA,685
70
+ glpi_python_client/content/tests/__init__.py,sha256=JdUxM9egC0BznEOiBqbd_3lX415EodrRx6-5_pzEx6k,202
71
+ glpi_python_client/content/tests/test_conversion.py,sha256=bsO8aqOMLahkv3eYJxQIigTy6aIcs-9euZt6ZhNBY4c,456
72
+ glpi_python_client/models/__init__.py,sha256=a7OnNfX4wYfRW8pqu-XStPJmCvfL2LcTDMuGtM5uvq4,606
73
+ glpi_python_client/models/_base.py,sha256=gf9iXJ1rYVG6Cit_AXi_5HxNQ7XuNrk2wUhHeXnbung,621
74
+ glpi_python_client/models/_payload.py,sha256=p5LeaiWEgFWF7EFvMY4YsEF9RI5NINxKE_1Mq6e8oGU,2428
75
+ glpi_python_client/models/_shared.py,sha256=szmScMXIVHycJ9z5sLQ_ph_7zv-Qr_5LnISwwK7pHHI,918
76
+ glpi_python_client/models/glpi/__init__.py,sha256=fJDrq-W8nGTIScGIdgko4Ws8l3k5G8sepCvqfA00c1Q,916
77
+ glpi_python_client/models/glpi/_document.py,sha256=XA1Wdqq4XDx0nrtAJZIKlbIm4Rs5x3OJGEtw2GmLIKI,1806
78
+ glpi_python_client/models/glpi/_followup.py,sha256=VwrSqv65sl1xKQRoq5RGXtYSqiaxz4FulGXN1BXV5ks,2591
79
+ glpi_python_client/models/glpi/_location.py,sha256=45PtXEv3YyJPrB2u64c2wwL95Bc96kZmHFE_A9Fqiug,1318
80
+ glpi_python_client/models/glpi/_solution.py,sha256=cltVqyx6bymgLKiGbe1qJ0Im8ePs5ofWa8OWHrsh8Us,1718
81
+ glpi_python_client/models/glpi/_task.py,sha256=NTFMzx9C2UHGQPyaMtwOtz75PoI95Q46bfk9LCb6dFE,1104
82
+ glpi_python_client/models/glpi/_team_member.py,sha256=2JeC1M4S4jiZoMObQwIcAA_6odCI712rYu0T-PFpns8,826
83
+ glpi_python_client/models/glpi/_ticket.py,sha256=JjPSlJvWWbJGl-cmXftKkqHBAGXKN7Bzhuf06eohsqQ,10993
84
+ glpi_python_client/models/glpi/_user.py,sha256=Wsk9ru30-UUlfkRkID2q87HnWmlWGnsTE-P4eKT2wQM,2847
85
+ glpi_python_client/models/glpi/tests/__init__.py,sha256=WH59nDuhzrecSqvnvojtpeHgujwX-iBHaEAjPjGJjvM,194
86
+ glpi_python_client/models/glpi/tests/test__document.py,sha256=mkAVDvWY-R8G9OEEPiA8bHMKYb7aec1RS6iuoVlSWpA,374
87
+ glpi_python_client/models/glpi/tests/test__followup.py,sha256=JcSHlSyPQtiBRkZ-rH62WUaXJIW-u0uowrCswotpwPY,934
88
+ glpi_python_client/models/glpi/tests/test__location.py,sha256=jxw293UIIZRDaoD8Gg3Q-jJu_8MxN8YUlAObYCf8OXI,322
89
+ glpi_python_client/models/glpi/tests/test__solution.py,sha256=CJkl6hSt8aPkBygOLOqe_NJW3fp1jk9meFNMWt0aPR0,327
90
+ glpi_python_client/models/glpi/tests/test__ticket.py,sha256=PraCBnoixeqjIncoRSNsKOeWPe44u8TqGokl6BKBH4w,1541
91
+ glpi_python_client/models/glpi/tests/test__user.py,sha256=84MXB2cy1FKg-N7UFJ_QsXGn_XtMglm5fWPhcaJ5Kdk,826
92
+ glpi_python_client/testing/__init__.py,sha256=1xZyq7u_JKmo2_2WLajpQKSVx1akiA5nBXdrpROC5zM,616
93
+ glpi_python_client/testing/fixtures.py,sha256=HdFNQJrxaB0K8sUWVSFNHMR2_TZnYbqCZg-XZLBI5M0,1375
94
+ glpi_python_client/testing/utils.py,sha256=vD6t0j9OEbu_UjkrH9L-Z5UfppPS0VkfViwsk9jlKTs,4338
95
+ glpi_python_client-0.1.0.dist-info/METADATA,sha256=dAz4QRoSwkwP8_hlhDTwpj_tEGdLSip4TsxoV0X6Bjk,5195
96
+ glpi_python_client-0.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
97
+ glpi_python_client-0.1.0.dist-info/licenses/LICENSE,sha256=nL8re-TIKkxCoL7OkSBja6EB4NsQR1HoOJgxv_MEhtc,1088
98
+ glpi_python_client-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 glpi-python-client contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.