Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,28 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm

---

## [Unreleased]

### Removed

- **GLPI 9.x is no longer listed as supported.** The README and docs claimed
"9.1 and later" (one page said "tested on 9.x"), but no 9.x release was ever
tested and the official `glpi/glpi` images start at 10.0. Supported: GLPI
10.0, 11.x and 12.x; the High-Level API clients need 11.0.6+.

### Added

- **Integration tests against real GLPI in CI** (`tests/integration`,
`.github/workflows/integration.yaml`): both clients, sync and async, against
the latest patch of `glpi/glpi:10.0`, `11.0` and `12.0` on every pull request
and weekly. Each bug fixed in 1.5.0 has a test that fails on the old
behaviour. Skipped locally unless `GLPI_IT_URL` is set.
- **DCO sign-off required on contributions** (`DCO`, `dco` CI check).
- **Lint and type checks in CI:** `ruff check` (rules in `ruff.toml`) and
`mypy --strict`, pinned versions; the code base is clean on both.

---

## [2.0.0] – 2026-10-13

**License change: MIT → AGPL-3.0-or-later.** From 2.0.0 on, python-glpi-utils is
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ On the GLPI side, enable the API in *Setup → General → API*. For the legacy

| Sync / async | GLPI API | Auth | GLPI versions |
|---|---|---|---|
| `GlpiAPI` / `AsyncGlpiAPI` | legacy `/apirest.php` | username + password, or personal `user_token` | 9.1 and later |
| `GlpiAPI` / `AsyncGlpiAPI` | legacy `/apirest.php` | username + password, or personal `user_token` | 10.0 and later |
| `GlpiOAuthClient` / `AsyncGlpiOAuthClient` | High-Level `/api.php` | OAuth2 password grant, token refreshed automatically | 11.0.6 and later, 12 |

```python
Expand Down Expand Up @@ -87,7 +87,7 @@ Guides and API reference: **https://giovanny07.github.io/python-glpi-utils/**

Beta, actively maintained. Releases follow [semantic versioning](https://semver.org/) and every change is listed in the [CHANGELOG](https://github.com/giovanny07/python-glpi-utils/blob/main/CHANGELOG.md). The legacy clients are the most stable part. The OAuth2 clients follow GLPI's High-Level API, which is still evolving, and their behaviour changed in 1.4 and 1.5.

Tested in CI on Python 3.9 to 3.13 with mocked HTTP. Tested by hand against real servers for 1.5.0 (2026-10-13): GLPI 10.0.28 (legacy API), 11.0.9 and 12.0.0 (legacy API, High-Level API 2.3 and 3.0). Older GLPI 9.x and 10.x releases are expected to work with the legacy clients but are not tested.
Unit tests run in CI on Python 3.9 to 3.13. Integration tests run both clients, sync and async, against official `glpi/glpi` containers: the latest patch of GLPI 10.0 (legacy API), 11.0 and 12.0 (legacy API and every High-Level API version the server offers), on every pull request and weekly. GLPI 9.x is not supported.

## Contributing

Expand Down
8 changes: 4 additions & 4 deletions docs/guides/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,18 @@
| Dependency | Version |
|------------|---------|
| Python | ≥ 3.9 |
| GLPI | ≥ 9.1 |
| GLPI | ≥ 10.0 |
| requests | ≥ 2.28 |
| aiohttp | ≥ 3.9 *(async only)* |

### GLPI version compatibility

| Client | Endpoint | GLPI version |
|--------|----------|-------------|
| `GlpiAPI` / `AsyncGlpiAPI` | `/apirest.php` | **≥ 9.1** — tested on 9.x, 10.x and 11.x |
| `GlpiOAuthClient` / `AsyncGlpiOAuthClient` | `/api.php` | **11+ only** |
| `GlpiAPI` / `AsyncGlpiAPI` | `/apirest.php` | **10.0, 11.x, 12.x** |
| `GlpiOAuthClient` / `AsyncGlpiOAuthClient` | `/api.php` | **11.0.6+, 12.x** |

The legacy REST API (`/apirest.php`) has been stable since GLPI 9.1. The OAuth2 high-level API (`/api.php`) was introduced in GLPI 11.
The OAuth2 high-level API (`/api.php`) was introduced in GLPI 11. GLPI 9.x is not supported. Tested in CI against real servers: the latest patch of GLPI 10.0, 11.0 and 12.0, on every pull request and weekly.

---

Expand Down
2 changes: 1 addition & 1 deletion docs/guides/oauth2.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
!!! warning "GLPI 11 and 12 only"
The OAuth2 high-level API (`/api.php`) was introduced in GLPI 11. If you are running GLPI 9.x or 10.x, use `GlpiAPI` or `AsyncGlpiAPI` instead.
The OAuth2 high-level API (`/api.php`) was introduced in GLPI 11. If you are running GLPI 10.x, use `GlpiAPI` or `AsyncGlpiAPI` instead.

!!! warning "GLPI 11.0.6+ recommended"
`DELETE` and `Timeline` sub-item endpoints (`Followup`, `Task`, `Solution`) return
Expand Down
10 changes: 5 additions & 5 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@

| Client | Endpoint | GLPI version |
|--------|----------|-------------|
| `GlpiAPI` | `/apirest.php` | **≥ 9.1** (tested on 10.x, 11.x and 12.0) |
| `AsyncGlpiAPI` | `/apirest.php` | **≥ 9.1** (tested on 10.x, 11.x and 12.0) |
| `GlpiOAuthClient` | `/api.php` | **11+ only** |
| `AsyncGlpiOAuthClient` | `/api.php` | **11+ only** |
| `GlpiAPI` | `/apirest.php` | **10.0, 11.x, 12.x** |
| `AsyncGlpiAPI` | `/apirest.php` | **10.0, 11.x, 12.x** |
| `GlpiOAuthClient` | `/api.php` | **11.0.6+, 12.x** |
| `AsyncGlpiOAuthClient` | `/api.php` | **11.0.6+, 12.x** |

The legacy REST API (`/apirest.php`) has been stable since GLPI 9.1 and works without changes across 9.x, 10.x, 11.x and 12.x.
The legacy REST API (`/apirest.php`) works the same on GLPI 10.0, 11.x and 12.x. GLPI 9.x is not supported. Tested in CI against real servers: the latest patch of GLPI 10.0, 11.0 and 12.0, on every pull request and weekly.
The high-level OAuth2 API (`/api.php`) was introduced in GLPI 11 (HL API 2.x); GLPI 12 adds HL API 3.0.

---
Expand Down
2 changes: 1 addition & 1 deletion examples/api/basic_usage.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

"""
Basic usage — synchronous client (GlpiAPI)
Works with GLPI 9.1, 10.x and 11.x via /apirest.php
Works with GLPI 10.0, 11.x and 12.x via /apirest.php

Usage:
export GLPI_URL=https://glpi.example.com
Expand Down
2 changes: 1 addition & 1 deletion examples/async_api/basic_async.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

"""
Basic usage — asynchronous client (AsyncGlpiAPI)
Works with GLPI 9.1, 10.x and 11.x via /apirest.php
Works with GLPI 10.0, 11.x and 12.x via /apirest.php

Requirements:
pip install glpi-utils[async]
Expand Down
2 changes: 1 addition & 1 deletion glpi_utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
glpi_utils
~~~~~~~~~~

Python library for the GLPI REST API (legacy and High-Level, GLPI 9.1 to 12).
Python library for the GLPI REST API (legacy and High-Level, GLPI 10 to 12).

Clients
-------
Expand Down
2 changes: 1 addition & 1 deletion mkdocs.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
site_name: python-glpi-utils
site_description: Python library for the GLPI REST API (GLPI 9.1 to 12)
site_description: Python library for the GLPI REST API (GLPI 10 to 12)
site_url: https://giovanny07.github.io/python-glpi-utils/
repo_url: https://github.com/giovanny07/python-glpi-utils
repo_name: giovanny07/python-glpi-utils
Expand Down
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name = glpi-utils
version = 2.0.0
author = Giovanny Rodriguez
author_email = giovanny@imagunet.com
description = Python client for GLPI's legacy REST API and OAuth2 High-Level API, sync or async (GLPI 9.1 to 12)
description = Python client for GLPI's legacy REST API and OAuth2 High-Level API, sync or async (GLPI 10 to 12)
long_description = file: README.md
long_description_content_type = text/markdown
license_expression = AGPL-3.0-or-later
Expand Down
Loading