kelvin-rest-api-client


Namekelvin-rest-api-client JSON
Version 2.2.3 PyPI version JSON
download
home_pagehttps://github.com/univention/kelvin-rest-api-client
SummaryPython library to interact with the UCS@school Kelvin REST API.
upload_time2023-06-23 04:21:55
maintainer
docs_urlNone
authorDaniel Troeder
requires_python>=3.7
licenseGNU Affero General Public License v3
keywords univention ucs ucs@school rest
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI
coveralls test coverage No coveralls.
            =========================================
Python UCS\@school Kelvin REST API Client
=========================================

|python| |license| |code style| |bandit| |codecov| |docspassing| |gh Code Linting| |gh Integration tests|

Python library to interact with the `UCS\@school Kelvin REST API`_.

* Free software: GNU Affero General Public License version 3
* Documentation: https://kelvin-rest-api-client.readthedocs.io


Features
--------

* Asynchronous
* Automatic handling of HTTP(S) sessions
* Type annotations
* ~95% test coverage (unittests + integration tests)
* Python 3.7, 3.8, 3.9, 3.10

Compatibility
-------------

A list of UCS\@school Kelvin REST API server versions which introduce breaking changes can be found in the [UCS\@school Kelvin REST API Documentation](https://docs.software-univention.de/ucsschool-kelvin-rest-api/kelvin-client-compatibility.html).


Usage
-----

The ``Session`` context manager opens and closes a HTTP session:

.. code-block:: python

    >>> import asyncio
    >>> from ucsschool.kelvin.client import Session, User, UserResource
    >>>
    >>> async def get_user(username: str) -> User:
    ...     async with Session(
    ...         "USERNAME",
    ...         "PASSWORD",
    ...         "master.ucs.local",
    ...         verify="ucs-root-ca.crt"
    ...     ) as session:
    ...         return await UserResource(session=session).get(name=username)
    ...
    >>> obj = asyncio.run(get_user("demo_student"))
    >>>
    >>> print(obj)
    User('name'='test_user', dn='uid=test_user,cn=schueler,cn=users,ou=DEMOSCHOOL,dc=example,dc=com')
    >>> print(obj.firstname, obj.lastname)
    Test User

There are more examples in the `docs`_ *usage* section.

For HTTPS to work, the SSL CA of the target system (UCS Master) must either be publicly signed, installed on the client system or available as file (as in the example above).
If the SSL CA certificate is not available ``verify=False``.
Obviously that is *not safe*! The CA of any UCS server can always be downloaded from ``http://FQDN.OF.UCS/ucs-root-ca.crt``.


Installation
------------

Install *UCS\@school Kelvin REST API Client* via pip from `PyPI`_:

.. code-block:: console

    $ pip install kelvin-rest-api-client


Tests
-----

There are some isolated unittests, but most tests run against a real *UCS\@school Kelvin REST API*.
A UCS Docker container has been prepared for this (additionally to the Kelvin API Docker container).
The ``Makefile`` automates downloading and starting the Docker containers (3.2 GB GB) and running the tests.
It is also possible to use an existing UCS DC Master with UCS\@school and the Kelvin API installed.

The tests expect the existence of two schools (``OUs``) on the target system (the Kelvin API does not support creation of schools yet).
The schools are ``DEMOSCHOOL`` and ``DEMOSCHOOL2``.
The first one usually already exists, but trying to create it again is safe.
To create the schools run *on the UCS DC Master*:

.. code-block:: console

    $ /usr/share/ucs-school-import/scripts/create_ou DEMOSCHOOL
    $ /usr/share/ucs-school-import/scripts/create_ou DEMOSCHOOL2

Furthermore an email domain must exist:

.. code-block:: console

    $ udm mail/domain create \
        --ignore_exists \
        --position "cn=domain,cn=mail,$(ucr get ldap/base)" \
        --set name="$(ucr get domainname)"

Since version ``1.5.0`` the Kelvin REST API supports UDM properties in all resources. A configuration is required for the tests for this feature:

.. code-block:: console

    $ cat > /etc/ucsschool/kelvin/mapped_udm_properties.json <<__EOF__
    {
        "user": ["title"],
        "school_class": ["mailAddress"],
        "school": ["description"]
    }
    __EOF__

The provided UCS Docker containers already contain both OUs.
They can be started using the Makefile:

.. code-block:: console

    $ make start-docker-containers

    Downloading Docker image '..-ucsschool-udm-rest-api-only:stable-4.4-8'...
    Downloading Docker image '../ucsschool-kelvin-rest-api:1.5.5'...
    Starting UCS docker container...
    Waiting for UCS docker container to start...
    Waiting for IP address of UCS container...
    Waiting for UDM REST API...........
    Creating Kelvin REST API container...
    Configuring Kelvin REST API container...
    Rebuilding the OpenAPI client library in the Kelvin API Container...
    Starting Kelvin REST API server...
    Waiting for Kelvin docker container to start...
    Waiting for IP address of Kelvin container...
    Waiting for Kelvin API...
    Fixing log file permissions...
    Setting up reverse proxy...
    ==> UDM REST API log file: /tmp/udm-rest-api-log/directory-manager-rest.log
    ==> UDM REST API: http://172.17.0.2/univention/udm/
    ==> Kelvin API configs: /tmp/kelvin-api/configs/
    ==> Kelvin API hooks: /tmp/kelvin-api/kelvin-hooks/
    ==> Kelvin API log file: /tmp/kelvin-api/log/http.log
    ==> Kelvin API: http://172.17.0.3:8911/ucsschool/kelvin/v1/docs
    ==> Kelvin API: https://172.17.0.2/ucsschool/kelvin/v1/docs

The Docker containers can be stopped and removed by running:

.. code-block:: console

    $ make stop-and-remove-docker-containers

The Docker images will not be removed, only the running containers.

Run tests with current Python interpreter:

.. code-block:: console

    $ make test

Using `tox`_ the tests can be executed with all supported Python versions:

.. code-block:: console

    $ make test-all

To use an existing UCS server for the tests, copy the file ``tests/test_server_example.yaml`` to ``tests/test_server.yaml`` and adapt the settings before starting the tests:

.. code-block:: console

    $ cp tests/test_server_example.yaml tests/test_server.yaml
    $ $EDITOR tests/test_server.yaml
    # check settings with a single test:
    $ python -m pytest tests/test_user.py::test_get
    # if OK, run all tests:
    $ make test


Logging
-------

Standard logging is used for tracking the libraries activity.
To capture the log messages for this project, subscribe to a logger named ``ucsschool.kelvin.client``.
*Attention:* Passwords and session tokens will be logged at log level ``DEBUG``!

The *UCS\@school Kelvin REST API* on the UCS server logs into the file ``/var/log/univention/ucsschool-kelvin-rest-api/http.log``.
The *UDM REST API* on the UCS server logs into the file ``/var/log/univention/directory-manager-rest.log``.

Repo permissions
----------------
* Github: @dansan and @JuergenBS
* Gitlab: @JuergenBS
* PyPI: @dansan and @SamuelYaron
* RTD: @dansan and @SamuelYaron

Credits
-------

.. _`UCS\@school Kelvin REST API`: https://docs.software-univention.de/ucsschool-kelvin-rest-api/
.. _`tox`: http://tox.readthedocs.org/
.. _`docs`: https://kelvin-rest-api-client.readthedocs.io
.. _`PyPI`: https://pypi.org/project/kelvin-rest-api-client/
.. |license| image:: https://img.shields.io/badge/License-AGPL%20v3-orange.svg
    :alt: GNU AGPL V3 license
    :target: https://www.gnu.org/licenses/agpl-3.0
.. |python| image:: https://img.shields.io/badge/python-3.7+-blue.svg
    :alt: Python 3.7+
    :target: https://www.python.org/
.. |code style| image:: https://img.shields.io/badge/code%20style-black-000000.svg
    :alt: Code style: black
    :target: https://github.com/psf/black
.. |codecov| image:: https://codecov.io/gh/univention/kelvin-rest-api-client/branch/master/graph/badge.svg
    :alt: Code coverage
    :target: https://codecov.io/gh/univention/kelvin-rest-api-client
.. |docspassing| image:: https://readthedocs.org/projects/kelvin-rest-api-client/badge/?version=latest
    :alt: Documentation Status
    :target: https://kelvin-rest-api-client.readthedocs.io/en/latest/?badge=latest
.. |travisci| image:: https://travis-ci.com/univention/kelvin-rest-api-client.svg?branch=master
    :target: https://app.travis-ci.com/github/univention/kelvin-rest-api-client
.. |bandit| image:: https://img.shields.io/badge/security-bandit-yellow.svg
    :alt: Security: bandit
    :target: https://github.com/PyCQA/bandit
.. |gh Code Linting| image:: https://github.com/univention/kelvin-rest-api-client/workflows/Code%20Linting/badge.svg
    :target: https://github.com/univention/kelvin-rest-api-client/actions?query=workflow%3A%22Code+Linting%22
.. |gh Integration tests| image:: https://github.com/univention/kelvin-rest-api-client/workflows/Integration%20tests/badge.svg
    :target: https://github.com/univention/kelvin-rest-api-client/actions?query=workflow%3A%22Integration+tests%22


=======
History
=======

2.2.3 (2023-06-22)

* ``%xx`` escaped names of school classes, users and workgroups are now unescaped.

2.2.2 (2023-04-14)
------------------

* Support HEAD for ``SchoolClass``, ``User``, ``WorkGroup``, and ``Role``.

2.2.1 (2022-12-15)
------------------

* Use deepcopy in ``to_dict`` method to prevent values of ``udm_properties`` from being updated in objects which are copied.

2.2.0 (2022-10-13)
--------------------

* Support Http ``Accept-Language`` Header.

2.1.0 (2022-10-07)
--------------------

* Support HEAD for ``School``.

2.0.1 (2022-10-05)
--------------------

* Use detailed upstream error message in ``InvalidRequest`` exception messages.

2.0.0 (2022-09-10)
--------------------

* **API Change**: The required argument ``school`` in the ``User`` constructor has now the default argument ``None``. The argument ``name`` is not required anymore. Optional values, which are set to ``None``, are not passed to the Kelvin server anymore. This enables automatic value generation on the Kelvin REST API server. To make use of this, the attributes can be either set to ``None``, the empty string ``""`` or left out completely. Additionally, you have to create a schema for the corresponding attribute on the Kelvin REST API server.
* Send a correlation ID with each request.

1.7.1 (2022-08-30)
--------------------

* Loosen dependency constraints.

1.7.0 (2022-07-07)
--------------------

* Support user ``workgroups`` attribute.

1.6.1 (2022-06-30)
--------------------

* Ignore unknown attributes in KelvinObject child classes.

1.6.0 (2022-06-27)
--------------------

* Add support for workgroup resource.

1.5.2.1 (2022-04-05)
--------------------

* Fixed: Logger does replace values of credentials with placeholders.

1.5.2 (2022-02-22)
------------------

* Automatic tests now run with Python 3.7 - 3.10.
* Fixed: The timeout attribute from a session instance is now used for requests.

1.5.1 (2021-11-30)
------------------

* Add attribute ``expiration_date`` to the ``User`` class. The attribute was added to the Kelvin REST API app in version ``1.5.1``.

1.5.0 (2021-09-21)
------------------

* Add attribute ``udm_properties`` to classes ``School`` and ``SchoolClass``.  The attributes were added to the Kelvin REST API app in version ``1.5.0``.

0.3.0 (2021-05-04)
------------------

* Add support for the creation of school (OU) objects.

0.2.2 (2020-11-09)
------------------

* Add support for the ``kelvin_password_hashes`` attribute of the ``User`` class.

0.2.1 (2020-08-07)
------------------

* fix JWT token validity calculation: timestamp uses UTC
* documentation fixes
* dependency updates
* tests also run on Python 3.9-dev

0.2.0 (2020-04-17)
------------------

* move tox to test requirements
* fix user object creation with default parameters
* change ``as_dict`` to be a method instead of a property
* fix flaky tests
* improve test coverage
* pass more env args to tox
* fix AttributeError with repr(role)
* add complete usage documentation

0.1.0 (2020-04-16)
------------------

* First release.



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/univention/kelvin-rest-api-client",
    "name": "kelvin-rest-api-client",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": "",
    "keywords": "Univention UCS UCS@school REST",
    "author": "Daniel Troeder",
    "author_email": "troeder@univention.de",
    "download_url": "https://files.pythonhosted.org/packages/ac/d4/cc4bcbf857bcb2d51e5380f4762c0ca76aef85e5696c61a7d9f0ed1a5095/kelvin-rest-api-client-2.2.3.tar.gz",
    "platform": null,
    "description": "=========================================\nPython UCS\\@school Kelvin REST API Client\n=========================================\n\n|python| |license| |code style| |bandit| |codecov| |docspassing| |gh Code Linting| |gh Integration tests|\n\nPython library to interact with the `UCS\\@school Kelvin REST API`_.\n\n* Free software: GNU Affero General Public License version 3\n* Documentation: https://kelvin-rest-api-client.readthedocs.io\n\n\nFeatures\n--------\n\n* Asynchronous\n* Automatic handling of HTTP(S) sessions\n* Type annotations\n* ~95% test coverage (unittests + integration tests)\n* Python 3.7, 3.8, 3.9, 3.10\n\nCompatibility\n-------------\n\nA list of UCS\\@school Kelvin REST API server versions which introduce breaking changes can be found in the [UCS\\@school Kelvin REST API Documentation](https://docs.software-univention.de/ucsschool-kelvin-rest-api/kelvin-client-compatibility.html).\n\n\nUsage\n-----\n\nThe ``Session`` context manager opens and closes a HTTP session:\n\n.. code-block:: python\n\n    >>> import asyncio\n    >>> from ucsschool.kelvin.client import Session, User, UserResource\n    >>>\n    >>> async def get_user(username: str) -> User:\n    ...     async with Session(\n    ...         \"USERNAME\",\n    ...         \"PASSWORD\",\n    ...         \"master.ucs.local\",\n    ...         verify=\"ucs-root-ca.crt\"\n    ...     ) as session:\n    ...         return await UserResource(session=session).get(name=username)\n    ...\n    >>> obj = asyncio.run(get_user(\"demo_student\"))\n    >>>\n    >>> print(obj)\n    User('name'='test_user', dn='uid=test_user,cn=schueler,cn=users,ou=DEMOSCHOOL,dc=example,dc=com')\n    >>> print(obj.firstname, obj.lastname)\n    Test User\n\nThere are more examples in the `docs`_ *usage* section.\n\nFor HTTPS to work, the SSL CA of the target system (UCS Master) must either be publicly signed, installed on the client system or available as file (as in the example above).\nIf the SSL CA certificate is not available ``verify=False``.\nObviously that is *not safe*! The CA of any UCS server can always be downloaded from ``http://FQDN.OF.UCS/ucs-root-ca.crt``.\n\n\nInstallation\n------------\n\nInstall *UCS\\@school Kelvin REST API Client* via pip from `PyPI`_:\n\n.. code-block:: console\n\n    $ pip install kelvin-rest-api-client\n\n\nTests\n-----\n\nThere are some isolated unittests, but most tests run against a real *UCS\\@school Kelvin REST API*.\nA UCS Docker container has been prepared for this (additionally to the Kelvin API Docker container).\nThe ``Makefile`` automates downloading and starting the Docker containers (3.2 GB GB) and running the tests.\nIt is also possible to use an existing UCS DC Master with UCS\\@school and the Kelvin API installed.\n\nThe tests expect the existence of two schools (``OUs``) on the target system (the Kelvin API does not support creation of schools yet).\nThe schools are ``DEMOSCHOOL`` and ``DEMOSCHOOL2``.\nThe first one usually already exists, but trying to create it again is safe.\nTo create the schools run *on the UCS DC Master*:\n\n.. code-block:: console\n\n    $ /usr/share/ucs-school-import/scripts/create_ou DEMOSCHOOL\n    $ /usr/share/ucs-school-import/scripts/create_ou DEMOSCHOOL2\n\nFurthermore an email domain must exist:\n\n.. code-block:: console\n\n    $ udm mail/domain create \\\n        --ignore_exists \\\n        --position \"cn=domain,cn=mail,$(ucr get ldap/base)\" \\\n        --set name=\"$(ucr get domainname)\"\n\nSince version ``1.5.0`` the Kelvin REST API supports UDM properties in all resources. A configuration is required for the tests for this feature:\n\n.. code-block:: console\n\n    $ cat > /etc/ucsschool/kelvin/mapped_udm_properties.json <<__EOF__\n    {\n        \"user\": [\"title\"],\n        \"school_class\": [\"mailAddress\"],\n        \"school\": [\"description\"]\n    }\n    __EOF__\n\nThe provided UCS Docker containers already contain both OUs.\nThey can be started using the Makefile:\n\n.. code-block:: console\n\n    $ make start-docker-containers\n\n    Downloading Docker image '..-ucsschool-udm-rest-api-only:stable-4.4-8'...\n    Downloading Docker image '../ucsschool-kelvin-rest-api:1.5.5'...\n    Starting UCS docker container...\n    Waiting for UCS docker container to start...\n    Waiting for IP address of UCS container...\n    Waiting for UDM REST API...........\n    Creating Kelvin REST API container...\n    Configuring Kelvin REST API container...\n    Rebuilding the OpenAPI client library in the Kelvin API Container...\n    Starting Kelvin REST API server...\n    Waiting for Kelvin docker container to start...\n    Waiting for IP address of Kelvin container...\n    Waiting for Kelvin API...\n    Fixing log file permissions...\n    Setting up reverse proxy...\n    ==> UDM REST API log file: /tmp/udm-rest-api-log/directory-manager-rest.log\n    ==> UDM REST API: http://172.17.0.2/univention/udm/\n    ==> Kelvin API configs: /tmp/kelvin-api/configs/\n    ==> Kelvin API hooks: /tmp/kelvin-api/kelvin-hooks/\n    ==> Kelvin API log file: /tmp/kelvin-api/log/http.log\n    ==> Kelvin API: http://172.17.0.3:8911/ucsschool/kelvin/v1/docs\n    ==> Kelvin API: https://172.17.0.2/ucsschool/kelvin/v1/docs\n\nThe Docker containers can be stopped and removed by running:\n\n.. code-block:: console\n\n    $ make stop-and-remove-docker-containers\n\nThe Docker images will not be removed, only the running containers.\n\nRun tests with current Python interpreter:\n\n.. code-block:: console\n\n    $ make test\n\nUsing `tox`_ the tests can be executed with all supported Python versions:\n\n.. code-block:: console\n\n    $ make test-all\n\nTo use an existing UCS server for the tests, copy the file ``tests/test_server_example.yaml`` to ``tests/test_server.yaml`` and adapt the settings before starting the tests:\n\n.. code-block:: console\n\n    $ cp tests/test_server_example.yaml tests/test_server.yaml\n    $ $EDITOR tests/test_server.yaml\n    # check settings with a single test:\n    $ python -m pytest tests/test_user.py::test_get\n    # if OK, run all tests:\n    $ make test\n\n\nLogging\n-------\n\nStandard logging is used for tracking the libraries activity.\nTo capture the log messages for this project, subscribe to a logger named ``ucsschool.kelvin.client``.\n*Attention:* Passwords and session tokens will be logged at log level ``DEBUG``!\n\nThe *UCS\\@school Kelvin REST API* on the UCS server logs into the file ``/var/log/univention/ucsschool-kelvin-rest-api/http.log``.\nThe *UDM REST API* on the UCS server logs into the file ``/var/log/univention/directory-manager-rest.log``.\n\nRepo permissions\n----------------\n* Github: @dansan and @JuergenBS\n* Gitlab: @JuergenBS\n* PyPI: @dansan and @SamuelYaron\n* RTD: @dansan and @SamuelYaron\n\nCredits\n-------\n\n.. _`UCS\\@school Kelvin REST API`: https://docs.software-univention.de/ucsschool-kelvin-rest-api/\n.. _`tox`: http://tox.readthedocs.org/\n.. _`docs`: https://kelvin-rest-api-client.readthedocs.io\n.. _`PyPI`: https://pypi.org/project/kelvin-rest-api-client/\n.. |license| image:: https://img.shields.io/badge/License-AGPL%20v3-orange.svg\n    :alt: GNU AGPL V3 license\n    :target: https://www.gnu.org/licenses/agpl-3.0\n.. |python| image:: https://img.shields.io/badge/python-3.7+-blue.svg\n    :alt: Python 3.7+\n    :target: https://www.python.org/\n.. |code style| image:: https://img.shields.io/badge/code%20style-black-000000.svg\n    :alt: Code style: black\n    :target: https://github.com/psf/black\n.. |codecov| image:: https://codecov.io/gh/univention/kelvin-rest-api-client/branch/master/graph/badge.svg\n    :alt: Code coverage\n    :target: https://codecov.io/gh/univention/kelvin-rest-api-client\n.. |docspassing| image:: https://readthedocs.org/projects/kelvin-rest-api-client/badge/?version=latest\n    :alt: Documentation Status\n    :target: https://kelvin-rest-api-client.readthedocs.io/en/latest/?badge=latest\n.. |travisci| image:: https://travis-ci.com/univention/kelvin-rest-api-client.svg?branch=master\n    :target: https://app.travis-ci.com/github/univention/kelvin-rest-api-client\n.. |bandit| image:: https://img.shields.io/badge/security-bandit-yellow.svg\n    :alt: Security: bandit\n    :target: https://github.com/PyCQA/bandit\n.. |gh Code Linting| image:: https://github.com/univention/kelvin-rest-api-client/workflows/Code%20Linting/badge.svg\n    :target: https://github.com/univention/kelvin-rest-api-client/actions?query=workflow%3A%22Code+Linting%22\n.. |gh Integration tests| image:: https://github.com/univention/kelvin-rest-api-client/workflows/Integration%20tests/badge.svg\n    :target: https://github.com/univention/kelvin-rest-api-client/actions?query=workflow%3A%22Integration+tests%22\n\n\n=======\nHistory\n=======\n\n2.2.3 (2023-06-22)\n\n* ``%xx`` escaped names of school classes, users and workgroups are now unescaped.\n\n2.2.2 (2023-04-14)\n------------------\n\n* Support HEAD for ``SchoolClass``, ``User``, ``WorkGroup``, and ``Role``.\n\n2.2.1 (2022-12-15)\n------------------\n\n* Use deepcopy in ``to_dict`` method to prevent values of ``udm_properties`` from being updated in objects which are copied.\n\n2.2.0 (2022-10-13)\n--------------------\n\n* Support Http ``Accept-Language`` Header.\n\n2.1.0 (2022-10-07)\n--------------------\n\n* Support HEAD for ``School``.\n\n2.0.1 (2022-10-05)\n--------------------\n\n* Use detailed upstream error message in ``InvalidRequest`` exception messages.\n\n2.0.0 (2022-09-10)\n--------------------\n\n* **API Change**: The required argument ``school`` in the ``User`` constructor has now the default argument ``None``. The argument ``name`` is not required anymore. Optional values, which are set to ``None``, are not passed to the Kelvin server anymore. This enables automatic value generation on the Kelvin REST API server. To make use of this, the attributes can be either set to ``None``, the empty string ``\"\"`` or left out completely. Additionally, you have to create a schema for the corresponding attribute on the Kelvin REST API server.\n* Send a correlation ID with each request.\n\n1.7.1 (2022-08-30)\n--------------------\n\n* Loosen dependency constraints.\n\n1.7.0 (2022-07-07)\n--------------------\n\n* Support user ``workgroups`` attribute.\n\n1.6.1 (2022-06-30)\n--------------------\n\n* Ignore unknown attributes in KelvinObject child classes.\n\n1.6.0 (2022-06-27)\n--------------------\n\n* Add support for workgroup resource.\n\n1.5.2.1 (2022-04-05)\n--------------------\n\n* Fixed: Logger does replace values of credentials with placeholders.\n\n1.5.2 (2022-02-22)\n------------------\n\n* Automatic tests now run with Python 3.7 - 3.10.\n* Fixed: The timeout attribute from a session instance is now used for requests.\n\n1.5.1 (2021-11-30)\n------------------\n\n* Add attribute ``expiration_date`` to the ``User`` class. The attribute was added to the Kelvin REST API app in version ``1.5.1``.\n\n1.5.0 (2021-09-21)\n------------------\n\n* Add attribute ``udm_properties`` to classes ``School`` and ``SchoolClass``.  The attributes were added to the Kelvin REST API app in version ``1.5.0``.\n\n0.3.0 (2021-05-04)\n------------------\n\n* Add support for the creation of school (OU) objects.\n\n0.2.2 (2020-11-09)\n------------------\n\n* Add support for the ``kelvin_password_hashes`` attribute of the ``User`` class.\n\n0.2.1 (2020-08-07)\n------------------\n\n* fix JWT token validity calculation: timestamp uses UTC\n* documentation fixes\n* dependency updates\n* tests also run on Python 3.9-dev\n\n0.2.0 (2020-04-17)\n------------------\n\n* move tox to test requirements\n* fix user object creation with default parameters\n* change ``as_dict`` to be a method instead of a property\n* fix flaky tests\n* improve test coverage\n* pass more env args to tox\n* fix AttributeError with repr(role)\n* add complete usage documentation\n\n0.1.0 (2020-04-16)\n------------------\n\n* First release.\n\n\n",
    "bugtrack_url": null,
    "license": "GNU Affero General Public License v3",
    "summary": "Python library to interact with the UCS@school Kelvin REST API.",
    "version": "2.2.3",
    "project_urls": {
        "Homepage": "https://github.com/univention/kelvin-rest-api-client"
    },
    "split_keywords": [
        "univention",
        "ucs",
        "ucs@school",
        "rest"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4418797a8f925cebce75dbaf27b45ac56b2b9a36420e7263c57e1f2f62723812",
                "md5": "42323514f92bef11165efdca9b0cd276",
                "sha256": "7b7f87de7bf066b7646db81f1b797df616d93edc870f027ab8305c4c4fdc23e9"
            },
            "downloads": -1,
            "filename": "kelvin_rest_api_client-2.2.3-py2.py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "42323514f92bef11165efdca9b0cd276",
            "packagetype": "bdist_wheel",
            "python_version": "py2.py3",
            "requires_python": ">=3.7",
            "size": 24248,
            "upload_time": "2023-06-23T04:21:52",
            "upload_time_iso_8601": "2023-06-23T04:21:52.630634Z",
            "url": "https://files.pythonhosted.org/packages/44/18/797a8f925cebce75dbaf27b45ac56b2b9a36420e7263c57e1f2f62723812/kelvin_rest_api_client-2.2.3-py2.py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "acd4cc4bcbf857bcb2d51e5380f4762c0ca76aef85e5696c61a7d9f0ed1a5095",
                "md5": "6b4513790ab65933935df443368d5b7f",
                "sha256": "f79404e675b3c56220cbac9ba0690b1b217a49bca9d4c6afdadc414cfcfd635c"
            },
            "downloads": -1,
            "filename": "kelvin-rest-api-client-2.2.3.tar.gz",
            "has_sig": false,
            "md5_digest": "6b4513790ab65933935df443368d5b7f",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 52984,
            "upload_time": "2023-06-23T04:21:55",
            "upload_time_iso_8601": "2023-06-23T04:21:55.202661Z",
            "url": "https://files.pythonhosted.org/packages/ac/d4/cc4bcbf857bcb2d51e5380f4762c0ca76aef85e5696c61a7d9f0ed1a5095/kelvin-rest-api-client-2.2.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-06-23 04:21:55",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "univention",
    "github_project": "kelvin-rest-api-client",
    "travis_ci": true,
    "coveralls": false,
    "github_actions": false,
    "requirements": [],
    "tox": true,
    "lcname": "kelvin-rest-api-client"
}
        
Elapsed time: 0.07951s