Metadata-Version: 2.4
Name: ff-ltitoolkit
Version: 0.1.0
Summary: Framework-agnostic LTI 1.3 Advantage toolkit for Python — connect any app to any LMS.
Project-URL: Homepage, https://github.com/CNIT-Organization/ltitoolkit
Project-URL: Repository, https://github.com/CNIT-Organization/ltitoolkit
Project-URL: Issues, https://github.com/CNIT-Organization/ltitoolkit/issues
Author: Faisal Fida
License-Expression: MIT
License-File: LICENSE
Keywords: canvas,education,lms,lti,lti-advantage,lti1.3,moodle,oidc
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Education
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Security
Classifier: Typing :: Typed
Requires-Python: >=3.10
Requires-Dist: jwcrypto>=1.5
Requires-Dist: pyjwt[crypto]<3,>=2.8
Requires-Dist: requests>=2.31
Requires-Dist: typing-extensions>=4.9
Provides-Extra: fastapi
Requires-Dist: fastapi>=0.110; extra == 'fastapi'
Requires-Dist: itsdangerous>=2.1; extra == 'fastapi'
Requires-Dist: python-multipart>=0.0.9; extra == 'fastapi'
Description-Content-Type: text/markdown

# ltitoolkit

A framework-agnostic **LTI 1.3 Advantage** toolkit for Python. Connect any Python
application to any LTI 1.3 compliant LMS — Canvas, Moodle, Blackboard, and more —
with a single dependency.

> Status: **early development (v0.1.0)** — the vendored LTI engine is in place;
> the FastAPI adapter, Dynamic Registration, and token minting are being built.
> See [`docs/PROJECT.md`](./docs/PROJECT.md) for the design rationale, capability
> boundaries, and roadmap.

## What it does (portable — same code on every LMS)

- **Launch & identity** — verified OIDC/JWT launch: who the user is, which course,
  what role.
- **LTI Advantage**
  - **AGS** — read/write grades for your tool's activities.
  - **NRPS** — fetch the current course roster.
  - **Deep Linking** — let instructors embed your content into a course.
- **Dynamic Registration** — install on a new LMS by pasting one URL (no credentials).
- **Client-credentials tokens** — authenticate as the tool with its own key; no user
  login required.

## What it deliberately does **not** do

LTI is not a remote control for the whole LMS. Listing all courses, browsing/opening
files, or creating native quizzes require each LMS's **proprietary** REST API and are
**not** part of this portable core. Put that code in thin, per-LMS adapters (e.g. a
Canvas adapter) built on top of the toolkit's generic token minting.

## Layout

```
src/ltitoolkit/
├── core/                  # vendored LTI 1.3 engine (PyLTI1p3, rebranded) — internal
├── fastapi/               # FastAPI adapter (Phase 2)
├── token/                 # generic client-credentials token minting (Phase 4)
└── dynamic_registration/  # single-URL install (Phase 5)
```

## Install (as a dependency)

Published via Git (no PyPI required). Pin to a tag:

```bash
pip install "git+https://github.com/CNIT-Organization/ltitoolkit.git@v0.1.0"
# with the FastAPI adapter:
pip install "ltitoolkit[fastapi] @ git+https://github.com/CNIT-Organization/ltitoolkit.git@v0.1.0"
```

## Develop (uv)

```bash
uv sync            # create the env + install runtime, fastapi extra, and dev tools
uv run pytest      # tests
uv run ruff check src tests
uv run mypy src
uv build           # build wheel + sdist into dist/
```

## License

MIT. The `core/` engine is a vendored copy of
[PyLTI1p3](https://github.com/dmitry-viskov/pylti1.3) (MIT); its original license
is preserved in [`LICENSE`](./LICENSE).
