Skip to main content

A Python3, async interface to the linkding REST API

Project description

🔖 aiolinkding: a Python3, async library to the linkding REST API

CI PyPi Version License Code Coverage Maintainability Say Thanks

Buy Me A Coffee

aiolinkding is a Python3, async library that interfaces with linkding instances. It is intended to be a reasonably light wrapper around the linkding API (meaning that instead of drowning the user in custom objects/etc., it focuses on returning JSON straight from the API).

Installation

Installation

pip install aiolinkding

Python Versions

aiolinkding is currently supported on:

  • Python 3.8
  • Python 3.9
  • Python 3.10

Usage

Creating a Client

It's easy to create an API client for a linkding instance. All you need are two parameters:

  1. A URL to a linkding instance
  2. A linkding API token
import asyncio

from aiolinkding import Client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = Client("http://127.0.0.1:8000", "token_abcde12345")


asyncio.run(main())

Working with Bookmarks

The Client object provides easy access to several bookmark-related API operations.

Getting All Bookmarks

import asyncio

from aiolinkding import Client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = Client("http://127.0.0.1:8000", "token_abcde12345")

    # Get all bookmarks:
    bookmarks = await client.bookmarks.async_get_all()
    # >>> { "count": 100, "next": null, "previous": null, "results": [...] }


asyncio.run(main())

client.bookmarks.async_get_all() takes three optional parameters:

  • query: a string query to filter the returned bookmarks
  • limit: the maximum number of results that should be returned
  • offset: the index from which to return results (e.g., 5 starts at the fifth bookmark)

Getting Archived Bookmarks

import asyncio

from aiolinkding import Client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = Client("http://127.0.0.1:8000", "token_abcde12345")

    # Get all archived bookmarks:
    bookmarks = await client.bookmarks.async_get_archived()
    # >>> { "count": 100, "next": null, "previous": null, "results": [...] }


asyncio.run(main())

client.bookmarks.async_get_archived() takes three optional parameters:

  • query: a string query to filter the returned bookmarks
  • limit: the maximum number of results that should be returned
  • offset: the index from which to return results (e.g., 5 starts at the fifth bookmark)

Getting a Single Bookmark by ID

import asyncio

from aiolinkding import Client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = Client("http://127.0.0.1:8000", "token_abcde12345")

    # Get a single bookmark:
    bookmark = await client.bookmarks.async_get_single(37)
    # >>> { "id": 37, "url": "https://example.com", "title": "Example title", ... }


asyncio.run(main())

Creating a New Bookmark

import asyncio

from aiolinkding import Client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = Client("http://127.0.0.1:8000", "token_abcde12345")

    # Create a new bookmark:
    created_bookmark = await client.bookmarks.async_create(
        "https://example.com",
        title="Example title",
        description="Example description",
        tag_names=[
            "tag1",
            "tag2",
        ],
    )
    # >>> { "id": 37, "url": "https://example.com", "title": "Example title", ... }


asyncio.run(main())

client.bookmarks.async_create() takes four optional parameters:

  • title: the bookmark's title
  • description: the bookmark's description
  • tag_names: the tags to assign to the bookmark (represented as a list of strings)
  • is_archived: whether the newly-created bookmark should automatically be archived
  • unread: whether the newly-created bookmark should be marked as unread

Updating an Existing Bookmark by ID

import asyncio

from aiolinkding import Client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = Client("http://127.0.0.1:8000", "token_abcde12345")

    # Update an existing bookmark:
    updated_bookmark = await client.bookmarks.async_update(
        37,
        url="https://different-example.com",
        title="Different example title",
        description="Different example description",
        tag_names=[
            "tag1",
            "tag2",
        ],
    )
    # >>> { "id": 37, "url": "https://different-example.com", ... }


asyncio.run(main())

client.bookmarks.async_update() takes four optional parameters (inclusion of any parameter will change that value for the existing bookmark):

  • url: the bookmark's URL
  • title: the bookmark's title
  • description: the bookmark's description
  • tag_names: the tags to assign to the bookmark (represented as a list of strings)
  • unread: whether the bookmark should be marked as unread

Archiving/Unarchiving a Bookmark

import asyncio

from aiolinkding import Client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = Client("http://127.0.0.1:8000", "token_abcde12345")

    # Archive a bookmark by ID:
    await client.bookmarks.async_archive(37)

    # ...and unarchive it:
    await client.bookmarks.async_unarchive(37)


asyncio.run(main())

Deleting a Bookmark

import asyncio

from aiolinkding import Client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = Client("http://127.0.0.1:8000", "token_abcde12345")

    # Delete a bookmark by ID:
    await client.bookmarks.async_delete(37)


asyncio.run(main())

Working with Tags

The Client object also provides easy access to several tag-related API operations.

Getting All Tags

import asyncio

from aiolinkding import Client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = Client("http://127.0.0.1:8000", "token_abcde12345")

    # Get all tags:
    tags = await client.tags.async_get_all()
    # >>> { "count": 100, "next": null, "previous": null, "results": [...] }


asyncio.run(main())

client.tags.async_get_all() takes two optional parameters:

  • limit: the maximum number of results that should be returned
  • offset: the index from which to return results (e.g., 5 starts at the fifth bookmark)

Getting a Single Tag by ID

import asyncio

from aiolinkding import Client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = Client("http://127.0.0.1:8000", "token_abcde12345")

    # Get a single tag:
    tag = await client.tags.async_get_single(22)
    # >>> { "id": 22, "name": "example-tag", ... }


asyncio.run(main())

Creating a New Tag

import asyncio

from aiolinkding import Client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    client = Client("http://127.0.0.1:8000", "token_abcde12345")

    # Create a new tag:
    created_tag = await client.tags.async_create("example-tag")
    # >>> { "id": 22, "name": "example-tag", ... }


asyncio.run(main())

Connection Pooling

By default, the library creates a new connection to linkding with each coroutine. If you are calling a large number of coroutines (or merely want to squeeze out every second of runtime savings possible), an aiohttp ClientSession can be used for connection pooling:

import asyncio

from aiohttp import ClientSession
from aiolinkding import Client


async def main() -> None:
    """Use aiolinkding for fun and profit."""
    async with ClientSession() as session:
        client = Client("http://127.0.0.1:8000", "token_abcde12345", session=session)

        # Get to work...


asyncio.run(main())

Contributing

  1. Check for open features/bugs or initiate a discussion on one.
  2. Fork the repository.
  3. (optional, but highly recommended) Create a virtual environment: python3 -m venv .venv
  4. (optional, but highly recommended) Enter the virtual environment: source ./.venv/bin/activate
  5. Install the dev environment: script/setup
  6. Code your new feature or bug fix.
  7. Write tests that cover your new functionality.
  8. Run tests and ensure 100% code coverage: nox -rs coverage
  9. Update README.md with any new documentation.
  10. Add yourself to AUTHORS.md.
  11. Submit a pull request!

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

aiolinkding-2022.7.0.tar.gz (10.4 kB view details)

Uploaded Source

Built Distribution

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

aiolinkding-2022.7.0-py3-none-any.whl (8.4 kB view details)

Uploaded Python 3

File details

Details for the file aiolinkding-2022.7.0.tar.gz.

File metadata

  • Download URL: aiolinkding-2022.7.0.tar.gz
  • Upload date:
  • Size: 10.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.14 CPython/3.7.13 Linux/5.15.0-1014-azure

File hashes

Hashes for aiolinkding-2022.7.0.tar.gz
Algorithm Hash digest
SHA256 04f14abbd300bc24754c0d0df6ac2bf547aba63ddca0e9b1482ae10ea22d0698
MD5 fe3915e31d5bb381eaf17433542cdfca
BLAKE2b-256 562100a558a2f0ff8d0c693422e7913535227cd7d04bd8df5ec0723064b88e20

See more details on using hashes here.

File details

Details for the file aiolinkding-2022.7.0-py3-none-any.whl.

File metadata

  • Download URL: aiolinkding-2022.7.0-py3-none-any.whl
  • Upload date:
  • Size: 8.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.14 CPython/3.7.13 Linux/5.15.0-1014-azure

File hashes

Hashes for aiolinkding-2022.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3ae442a00bb6ffe4b6686137c9fdaea9b331123c70e08f449c69ba68b2bbf242
MD5 ae32664b97f1515020545049d034373b
BLAKE2b-256 37d08d86044efa241056e10d27ce5475b27ebd257026e94a8b7e473ee2f538be

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