Skip to main content

Modern, Pythonic and type-safe Trac RPC API client

Project description

Trac RPC API client

PyPI License PyPI project Python versions Pydantic v2 Ruff CI

Modern, Pythonic and type-safe Trac RPC API client.

[!NOTE] This package was developed primarily to satisfy my personal migration needs and as such covers only the read interface of the API!

Please feel free to contact me for complex migration projects from Trac and/or custom development needs. High quality contributions that follow the library structure and donations are also much appreciated.

Installation

$ pip install trac-rpc

Dependencies

Usage

>>> from trac_rpc.client import ApiClient, HttpClient

>>> api_client = ApiClient(
    rpc_url="http://127.0.0.1:8000/login/rpc",
    http_client=HttpClient(auth=("admin", "admin")),
)

>>> api_client.get_api_version()
TracApiVersion(epoch=1, major=2, minor=0)

>>> result = api_client.get_ticket_last_field_change(1, "status", "closed")
>>> result.timestamp
datetime.datetime(2025, 2, 27, 13, 37, 11, 171873, tzinfo=TzInfo(UTC))

[!IMPORTANT] Trac APIs (e.g. query_tickets) do not return IDs and/or objects sorted in alphanumeric order!

They can either be returned in a custom order (such as priority levels) or grouped by certain fields (such as ticket IDs). If you want to iterate on the objects in a particular order, always remember to sort them appropriately after you call the API.

Customizing models

Changing default string type

Some models like TracMilestone can be parameterized with a string type such as TracStrippedStr instead of str to strip leading and trailing whitespace:

from trac_rpc.client import ApiClient
from trac_rpc.models import TracMilestone
from trac_rpc.validators import TracStrippedStr

api_client = ApiClient(rpc_url="http://127.0.0.1:8000/rpc")
milestone = api_client.get_milestone(" milestone2  ", TracMilestone[TracStrippedStr])

This is especially useful for migrations to detect unnoticed whitespace problems. However, this can potentially cause calls to the Trac RPC API with string object names to fail, so it is not enabled by default.

Adjusting TracTicket model

Each Trac installation is configured in its own way. The default TracTicket model can be easily customized by subclassing:

from trac_rpc.models import TracTicket as TracTicketBase
from trac_rpc.validators import TracSpaceOrCommaSeparated

class TracTicket(TracTicketBase):
    keywords: TracSpaceOrCommaSeparated[str]
    cc: TracSpaceOrCommaSeparated[str]

Usually Trac fields are separated by spaces (TracSpaceSeparated), but alternative types are provided for convenience (TracCommaSeparated, TracSpaceOrCommaSeparated).

Complex validation to ensure data consistency is possible with the validate_in_set validator:

from functools import partial
from typing import Annotated

from pydantic import AfterValidator
from trac_rpc.models import TracTicket as TracTicketBase
from trac_rpc.validators import validate_in_set, TracOptionalField

VERSIONS = {"1.0", "2.0"}


class TracTicket(TracTicketBase):
    validate_version = partial(validate_in_set, allowed=VERSIONS, optional=True)
    ...
    version: Annotated[TracOptionalField[str], AfterValidator(validate_version)]

Development

Setting up test Trac server

See GitHub Actions workflow for integration tests.

Releases

To release a new version and publish it to PyPI:

  • Bump version with hatch and commit
    • hatch version minor or hatch version patch
  • Create GitHub release (and tag)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

trac_rpc-0.1.2.tar.gz (41.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

trac_rpc-0.1.2-py3-none-any.whl (8.9 kB view details)

Uploaded Python 3

File details

Details for the file trac_rpc-0.1.2.tar.gz.

File metadata

  • Download URL: trac_rpc-0.1.2.tar.gz
  • Upload date:
  • Size: 41.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.11

File hashes

Hashes for trac_rpc-0.1.2.tar.gz
Algorithm Hash digest
SHA256 edf0445368f697a4a3ef7d1b08a635cc80f23c86a56a563841e68dc49bd63224
MD5 7b64b1b5a2538c055da27bccafd2091e
BLAKE2b-256 ecdc7adcf42f03aa42db971c02e6ffeb3d80ec7eb99c169fd39b37319c12b325

See more details on using hashes here.

File details

Details for the file trac_rpc-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: trac_rpc-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 8.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.11

File hashes

Hashes for trac_rpc-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 feeda3be2fcf4dcce7f847b984ebfc1a4f8bd7009d557219c86a6b6562c61d20
MD5 407182a528a1b4e951e581a5e24ca7e6
BLAKE2b-256 8657273521bdb9820c957cd18bb78c702d0683c692d73c2057eb145955794945

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page