docs(pydocs): full python wrapper documentation

This commit is contained in:
Scott Lyons 2024-09-05 14:33:45 -07:00
commit d4b1758262
9 changed files with 1150 additions and 0 deletions

28
docs/Makefile Normal file
View file

@ -0,0 +1,28 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = .
BUILDDIR = _build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
serve:
python -m http.server -d $(BUILDDIR)/html
clean:
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
pip uninstall -y szurubooru_client
maturin develop -F python -m ../szurubooru-client/Cargo.toml
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

63
docs/client.rst Normal file
View file

@ -0,0 +1,63 @@
Szurubooru Clients
==================
These are the clients available for interacting with Szurubooru. There are two clients, ``SzurubooruSyncClient`` and ``SzurubooruAsyncClient`` . The only difference
between the two of them is that ``SzurubooruAsyncClient`` is compatible with ``asyncio`` for use in ``async`` scripts.
.. contents:: Table of Contents
:depth: 3
:local:
Sync Client
-----------
.. autoclass:: szurubooru_client.SzurubooruSyncClient
Async Client
------------
.. autoclass:: szurubooru_client.SzurubooruAsyncClient
Exceptions
----------
All exceptions that are thrown by the client are instances of the ``SzuruClientError`` class. It's a tuple of two items: An exception type (as a string) and a string with more details
about the exception.
.. autoexception:: szurubooru_client.SzuruClientError
.. _rver:
Resource Versioning
-------------------
Many of the ``update`` and other methods on the client classes accept a ``version`` argument. This is part of Szurubooru's optimistic locking. Each resource has its ``version`` retuned
to the client through any of the ``get`` methods. This value must be provided to any of the ``update`` or ``delete`` methods. If the version doesn't match at the time
(due to a modified resource) then the call will fail.
Pagination
----------
Most of the ``list`` methods on the clients return a paged object that holds the results along with other details about the query:
.. autoclass:: szurubooru_client.PagedResult
Paging through the results of ``list`` methods are done using two parameters:
.. _limits:
Result Limits
^^^^^^^^^^^^^
Most of the ``list`` methods on the clients support a ``limit`` parameter. This parameter limits the number of resources returned by the method as part of
a :class:`~szurubooru_client.PagedResult` object
.. _offsets:
Result Offsets
^^^^^^^^^^^^^^
Most of the ``list`` methods on the clients support a ``offset`` parameter. This parameter skips through the results returned by the method as part of
a :class:`~szurubooru_client.PagedResult` object

41
docs/conf.py Normal file
View file

@ -0,0 +1,41 @@
# Configuration file for the Sphinx documentation builder.
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
project = 'Szurubooru Client'
copyright = '2024, Scott Lyons'
author = 'Scott Lyons'
# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
extensions = [
'myst_parser',
'sphinx.ext.autodoc',
"sphinx_codefence"
]
autodoc_default_options = {
'members': True,
'show-inheritance': True,
}
autodoc_typehints = "description"
templates_path = ['_templates']
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
source_suffix = {
'.rst': 'restructuredtext',
'.txt': 'markdown',
'.md': 'markdown',
}
# -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
html_theme = 'alabaster'
html_static_path = ['_static']

113
docs/examples.rst Normal file
View file

@ -0,0 +1,113 @@
========
Examples
========
.. contents:: Table of Contents
:depth: 3
:local:
All of these examples are taken from the ``python-sync`` script in the ``tests`` directory of the repo.
Before any of the examples will work, you need to import the right classes and functions:
```python
from szurubooru_client import *
from szurubooru_client.tokens import *
from szurubooru_client.models import *
```
Creating a client
^^^^^^^^^^^^^^^^^
```python
client = SzurubooruSyncClient("http://localhost:9802", username="integration_user",
password="integration_password", allow_insecure=True)
```
Creating a new tag
^^^^^^^^^^^^^^^^^^
```python
foo_tag = client.create_tag("foo", category="default", description="The foo tag")
assert foo_tag.names == ["foo"]
```
Returning only a subset of fields
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```python
# Omit the "description" field
tags = client.list_tags(fields=["version", "names", "category"])
assert tags.results[0].description is None
```
Uploading from a file path
^^^^^^^^^^^^^^^^^^^^^^^^^^
```python
folly1 = client.create_post(file_path="../folly1.jpg",
tags=["maine_coon", "cat", "folly1"],
safety=PostSafety.Safe)
```
Searching for an existing post using an image
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```python
folly1_search = client.post_for_image("../folly1.jpg")
assert folly1_search is not None
```
Querying by an anonymous tag
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```python
cat_posts = client.list_posts(query=[anonymous_token("cat")])
```
Querying by a named tag
^^^^^^^^^^^^^^^^^^^^^^^
```python
mc_posts = client.list_posts(query=[named_token(PostNamedToken.Tag, "maine_coon")])
```
Pagination
^^^^^^^^^^
```python
posts = client.list_posts(limit=1)
assert posts.total == 4
assert len(posts.results) == 1
posts2 = client.list_posts(limit=1, offset=1)
assert posts.results != posts2.results
```
Commenting on a post
^^^^^^^^^^^^^^^^^^^^
```python
cat_results = client.list_posts([anonymous_token("cat")])
post_id = cat_results.results[0].id
comment = client.create_comment("Excellent cat!", post_id)
```
Getting all comments for a post
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```python
comment_list = client.list_comments([named_token(CommentNamedToken.Post, post_id)])
assert len(comment_list.results) != 0
```
Downloading an image to a local path
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```python
cat_results = client.list_posts([anonymous_token("cat")])
post_id = cat_results.results[0].id
client.download_image_to_path(post_id, "/tmp/cat.jpg")
```

15
docs/fields.rst Normal file
View file

@ -0,0 +1,15 @@
Field selection
===============
The Szurubooru API supports *Field Selection*. This allows you to select only a subset of fields to return from the API. By default all fields are selected and returned, but if you
pass in a list of field names to any of the client methods that support it, only those fields will be populated in the models.
Example
-------
```python
tags = client.list_tags(fields=["version", "names", "category"])
assert tags.results[0].description is None
```
Because the ``description`` field was not specified, it's set to ``None``

15
docs/index.rst Normal file
View file

@ -0,0 +1,15 @@
Szurubooru Client documentation
===============================
Welcome to the documentation for ``szurubooru_client`` . This library is a wrapper around a Rust library for interacting with the self-hosted
image site `Szurubooru <https://github.com/rr-/szurubooru/tree/master>`_
.. toctree::
:maxdepth: 1
:caption: Contents:
client
tokens
models
fields
examples

35
docs/make.bat Normal file
View file

@ -0,0 +1,35 @@
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=.
set BUILDDIR=_build
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.https://www.sphinx-doc.org/
exit /b 1
)
if "%1" == "" goto help
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
:end
popd

10
docs/models.rst Normal file
View file

@ -0,0 +1,10 @@
Szurubooru Models
=================
.. contents:: Table of Contents
:depth: 3
:local:
.. automodule:: szurubooru_client.models
:members:
:undoc-members:

830
docs/tokens.rst Normal file
View file

@ -0,0 +1,830 @@
Szurubooru Query Tokens
=======================
.. contents:: Table of Contents
:depth: 3
:local:
Most of the ``list`` methods on the client support a ``query`` parameter. This parameter (a ``list`` of tokens) allows you to filter the results returned by the API.
There's four kinds of tokens: ``Named``, ``Sort``, ``Anonymous`` and ``Special``.
Because this library is a wrapper around a Rust library, there's a group of type-safe ``Enum`` objects that allow you to
make sure you get the right field names when constructing the tokens.
All tokens can be mixed and matched to filter the results how you'd prefer.
.. _named-tokens:
Named tokens
^^^^^^^^^^^^
.. autofunction:: szurubooru_client.tokens.named_token
.. _sort-tokens:
Sort tokens
^^^^^^^^^^^
.. autofunction:: szurubooru_client.tokens.sort_token
Anonymous tokens
^^^^^^^^^^^^^^^^
.. autofunction:: szurubooru_client.tokens.anonymous_token
Special tokens
^^^^^^^^^^^^^^
.. autofunction:: szurubooru_client.tokens.special_token
Negating tokens
^^^^^^^^^^^^^^^
All query tokens can be negated using either ``.negate`` or by prefixing with the ``-`` operator. Negated tokens mean to *not* match that particular token.
For example, to match the anonymous tag ``konosuba``, we would do the following:
```python
client.list_posts(query=[anonymous_token("konosuba")])
```
Now to match all posts that *don't* have the ``konosuba`` tag:
```python
client.list_posts(query=[-anonymous_token("konosuba")])
# or
client.list_posts(query=[anonymous_token("konosuba").negate()])
```
.. _named-tokens-enums:
Token Enums
^^^^^^^^^^^
-----------------
Named Token Enums
-----------------
.. py:class:: szurubooru_client.tokens.TagNamedToken
.. py:attribute:: Name
Having given name (accepts wildcards)
.. py:attribute:: Category
Having given category (accepts wildcards)
.. py:attribute:: CreationDate
Created at given date
.. py:attribute:: LastEditDate
Edited at given date
.. py:attribute:: LastEditTime
Alias of :attr:`LastEditTime <szurubooru_client.tokens.TagNamedToken.LastEditTime>`
.. py:attribute:: EditDate
Alias of :attr:`LastEditTime <szurubooru_client.tokens.TagNamedToken.LastEditTime>`
.. py:attribute:: EditTime
Alias of :attr:`LastEditTime <szurubooru_client.tokens.TagNamedToken.LastEditTime>`
.. py:attribute:: Usages
Used in given number of posts
.. py:attribute:: UsageCount
Alias of :attr:`Usages <szurubooru_client.tokens.TagNamedToken.Usages>`
.. py:attribute:: PostCount
Alias of :attr:`Usages <szurubooru_client.tokens.TagNamedToken.Usages>`
.. py:attribute:: SuggestionCount
With given number of suggestions
.. py:attribute:: ImplicationCount
With given number of implications
.. py:class:: szurubooru_client.tokens.PostNamedToken
.. py:attribute:: Id
Having given post number
.. py:attribute:: Tag
Having given tag (accepts wildcards)
.. py:attribute:: Score
Having given score
.. py:attribute:: Uploader
Uploaded by given user (accepts wildcards)
.. py:attribute:: Upload
Alias of :attr:`Uploader <szurubooru_client.tokens.PostNamedToken.Uploader>`
.. py:attribute:: Submit
Alias of :attr:`Uploader <szurubooru_client.tokens.PostNamedToken.Uploader>`
.. py:attribute:: Comment
Commented by given user (accepts wildcards)
.. py:attribute:: Fav
Favorited by given user (accepts wildcards)
.. py:attribute:: Pool
Belonging to the pool with the given id
.. py:attribute:: TagCount
Having given number of tags
.. py:attribute:: CommentCount
Having given number of comments
.. py:attribute:: FavCount
Favorited by given number of users
.. py:attribute:: NoteCount
Having given number of annotations
.. py:attribute:: NoteText
Having given note text (accepts wildcards)
.. py:attribute:: RelationCount
Having given number of relations
.. py:attribute:: FeatureCount
Having been featured given number of times
.. py:attribute:: Type
``flash`` (or ``swf``) or ``video`` (or ``webm``). Use :attr:`models.posttype` for type-safe values
.. py:attribute:: ContentChecksum
Having given sha1 checksum
.. py:attribute:: FileSize
Having given file size (in bytes)
.. py:attribute:: ImageWidth
Having given image width (where applicable)
.. py:attribute:: ImageHeight
Having given image height (where applicable)
.. py:attribute:: ImageArea
Having given number of pixels (image width * image height)
.. py:attribute:: ImageAspectRatio
Having given aspect ratio (image width / image height)
.. py:attribute:: ImageAr
Alias of :attr:`ImageAspectRatio <szurubooru_client.tokens.PostNamedToken.ImageAspectRatio>`
.. py:attribute:: Width
Alias of :attr:`ImageWidth <szurubooru_client.tokens.PostNamedToken.ImageWidth>`
.. py:attribute:: Height
Alias of :attr:`ImageHeight <szurubooru_client.tokens.PostNamedToken.ImageHeight>`
.. py:attribute:: Ar
Alias of :attr:`ImageAspectRatio <szurubooru_client.tokens.PostNamedToken.ImageAspectRatio>`
.. py:attribute:: AspectRatio
Alias of :attr:`ImageAspectRatio <szurubooru_client.tokens.PostNamedToken.ImageAspectRatio>`
.. py:attribute:: CreationDate
Posted at given date
.. py:attribute:: CreationTime
Alias of :attr:`CreationDate <szurubooru_client.tokens.PostNamedToken.CreationDate>`
.. py:attribute:: Date
Alias of :attr:`CreationDate <szurubooru_client.tokens.PostNamedToken.CreationDate>`
.. py:attribute:: Time
Alias of :attr:`CreationDate <szurubooru_client.tokens.PostNamedToken.CreationDate>`
.. py:attribute:: LastEditDate
Edited at given date
.. py:attribute:: LastEditTime
Alias of :attr:`LastEditDate <szurubooru_client.tokens.PostNamedToken.LastEditDate>`
.. py:attribute:: EditDate
Alias of :attr:`LastEditDate <szurubooru_client.tokens.PostNamedToken.LastEditDate>`
.. py:attribute:: EditTime
Alias of :attr:`LastEditDate <szurubooru_client.tokens.PostNamedToken.LastEditDate>`
.. py:attribute:: CommentDate
Commented at given date
.. py:attribute:: CommentTime
Alias of :attr:`CommentDate <szurubooru_client.tokens.PostNamedToken.CommentDate>`
.. py:attribute:: FavDate
Last favorited at given time
.. py:attribute:: FavTime
Alias of :attr:`FavDate <szurubooru_client.tokens.PostNamedToken.FavDate>`
.. py:attribute:: FeatureDate
Featured at given date
.. py:attribute:: FeatureTime
Alias of :attr:`FeatureDate <szurubooru_client.tokens.PostNamedToken.FeatureDate>`
.. py:attribute:: Safety
Use :class:`PostSafety <szurubooru_client.models.PostSafety>` for the type-safe version
.. py:attribute:: Rating
Alias of :attr:`Safety <szurubooru_client.tokens.PostNamedToken.Safety>`
.. py:class:: szurubooru_client.tokens.CommentNamedToken
.. py:attribute:: Id
Specific comment id
.. py:attribute:: Post
Specific post id
.. py:attribute:: User
Created by given user (accepts wildcards)
.. py:attribute:: Author
Alias of user
.. py:attribute:: Text
Containing given text (accepts wildcards)
.. py:attribute:: CreationDate
Created at given date
.. py:attribute:: CreationTime
Alias of :attr:`CreationDate <szurubooru_client.tokens.CommentNamedToken.CreationDate>`
.. py:attribute:: LastEditDate
Whose most recent edit date matches given date
.. py:attribute:: LastEditTime
Alias of :attr:`LastEditDate <szurubooru_client.tokens.CommentNamedToken.LastEditDate>`
.. py:attribute:: EditDate
Alias of :attr:`LastEditDate <szurubooru_client.tokens.CommentNamedToken.LastEditDate>`
.. py:attribute:: EditTime
Alias of :attr:`LastEditDate <szurubooru_client.tokens.CommentNamedToken.LastEditDate>`
.. py:class:: szurubooru_client.tokens.UserNamedToken
.. py:attribute:: Name
Having given name (accepts wildcards)
.. py:attribute:: CreationDate
Registered at given date
.. py:attribute:: CreationTime
Alias of :attr:`CreationDate <szurubooru_client.tokens.UserNamedToken.CreationDate>`
.. py:attribute:: LastLoginDate
Whose most recent login date matches given date
.. py:attribute:: LastLoginTime
Alias of :attr:`LastLoginDate <szurubooru_client.tokens.UserNamedToken.LastLoginDate>`
.. py:attribute:: LoginDate
Alias of :attr:`LastLoginDate <szurubooru_client.tokens.UserNamedToken.LastLoginDate>`
.. py:attribute:: LoginTime
Alias of :attr:`LastLoginDate <szurubooru_client.tokens.UserNamedToken.LastLoginDate>`
.. py:class:: szurubooru_client.tokens.SnapshotNamedToken
.. py:attribute:: Type
Involving given resource type
.. py:attribute:: Id
Involving given resource id
.. py:attribute:: Date
Created at given date
.. py:attribute:: Time
Alias of :attr:`Date <szurubooru_client.tokens.UserNamedToken.LastLoginDate>`
.. py:attribute:: Operation
``modified``, ``created``, ``deleted`` or ``merged``. Use :attr:`SnapshotType <szurubooru_client.models.SnapshotType>` for type-safe values
.. py:attribute:: User
Name of the user that created given snapshot (accepts wildcards)
.. _sort-tokens-enums:
----------------
Sort Token Enums
----------------
.. py:class:: szurubooru_client.tokens.PostSortToken
.. py:attribute:: Random
As random as it can get
.. py:attribute:: Id
Highest to lowest post number
.. py:attribute:: Score
Highest scored
.. py:attribute:: TagCount
With most tags
.. py:attribute:: CommentCount
Most commented first
.. py:attribute:: FavCount
Loved by most
.. py:attribute:: NoteCount
With most annotations
.. py:attribute:: RelationCount
With most relations
.. py:attribute:: FeatureCount
Most often featured
.. py:attribute:: FileSize
Largest files first
.. py:attribute:: ImageWidth
Widest images first
.. py:attribute:: ImageHeight
Tallest images first
.. py:attribute:: ImageArea
Largest images first
.. py:attribute:: Width
Alias of :attr:`ImageWidth <szurubooru_client.tokens.PostSortToken.imagewidth>`
.. py:attribute:: Height
Alias of :attr:`ImageHeight <szurubooru_client.tokens.PostSortToken.imageheight>`
.. py:attribute:: Area
Alias of :attr:`ImageArea <szurubooru_client.tokens.PostSortToken.imagearea>`
.. py:attribute:: CreationDate
Newest to oldest (pretty much same as id)
.. py:attribute:: CreationTime
Alias of :attr:`CreationDate <szurubooru_client.tokens.PostSortToken.creationdate>`
.. py:attribute:: Date
Alias of :attr:`CreationDate <szurubooru_client.tokens.PostSortToken.creationdate>`
.. py:attribute:: Time
Alias of :attr:`CreationDate <szurubooru_client.tokens.PostSortToken.creationdate>`
.. py:attribute:: LastEditDate
Like :attr:`CreationDate <szurubooru_client.tokens.PostSortToken.creationdate>`, only looks at last edit time instead
.. py:attribute:: LastEditTime
Alias of :attr:`LastEditDate <szurubooru_client.tokens.PostSortToken.lasteditdate>`
.. py:attribute:: EditDate
Alias of :attr:`LastEditDate <szurubooru_client.tokens.PostSortToken.lasteditdate>`
.. py:attribute:: EditTime
Alias of :attr:`LastEditDate <szurubooru_client.tokens.PostSortToken.lasteditdate>`
.. py:attribute:: CommentDate
Recently commented by anyone
.. py:attribute:: CommentTime
Alias of :attr:`CommentDate <szurubooru_client.tokens.PostSortToken.commentdate>`
.. py:attribute:: FavDate
Recently added to favorites by anyone
.. py:attribute:: FavTime
Alias of :attr:`FavDate <szurubooru_client.tokens.PostSortToken.favdate>`
.. py:attribute:: FeatureDate
Recently featured
.. py:attribute:: FeatureTime
Alias of :attr:`FeatureDate <szurubooru_client.tokens.PostSortToken.featuredate>`
.. py:class:: szurubooru_client.tokens.TagSortToken
.. py:attribute:: Random
As random as it can get
.. py:attribute:: Name
A to Z
.. py:attribute:: Category
Category (a to z)
.. py:attribute:: CreationDate
Recently created first
.. py:attribute:: CreationTime
Alias of :attr:`CreationDate <szurubooru_client.tokens.TagSortToken.CreationDate>`
.. py:attribute:: LastEditDate
Recently edited first
.. py:attribute:: LastEditTime
Alias of :attr:`CreationDate <szurubooru_client.tokens.TagSortToken.CreationDate>`
.. py:attribute:: EditDate
Alias of :attr:`CreationDate <szurubooru_client.tokens.TagSortToken.CreationDate>`
.. py:attribute:: EditTime
Alias of :attr:`CreationDate <szurubooru_client.tokens.TagSortToken.CreationDate>`
.. py:attribute:: Usages
Used in most posts first
.. py:attribute:: UsageCount
Alias of :attr:`Usages <szurubooru_client.tokens.TagSortToken.Usages>`
.. py:attribute:: PostCount
Alias of :attr:`Usages <szurubooru_client.tokens.TagSortToken.Usages>`
.. py:attribute:: SuggestionCount
With most suggestions first
.. py:attribute:: ImplicationCount
With most implications first
.. py:class:: szurubooru_client.tokens.CommentSortToken
.. py:attribute:: Random
As random as it can get
.. py:attribute:: User
Author name, a to z
.. py:attribute:: Author
Alias of user
.. py:attribute:: Post
Post id, newest to oldest
.. py:attribute:: CreationDate
Newest to oldest
.. py:attribute:: CreationTime
Alias of :attr:`CreationDate <szurubooru_client.tokens.CommentSortToken.CreationDate>`
.. py:attribute:: LastEditDate
Recently edited first
.. py:attribute:: LastEditTime
Alias of :attr:`LastEditDate <szurubooru_client.tokens.CommentSortToken.LastEditDate>`
.. py:attribute:: EditDate
Alias of :attr:`LastEditDate <szurubooru_client.tokens.CommentSortToken.LastEditDate>`
.. py:attribute:: EditTime
Alias of :attr:`LastEditDate <szurubooru_client.tokens.CommentSortToken.LastEditDate>`
.. py:class:: szurubooru_client.tokens.UserSortToken
.. py:attribute:: Random
As random as it can get
.. py:attribute:: Name
A to z
.. py:attribute:: CreationDate
Newest to oldest
.. py:attribute:: CreationTime
Alias of :attr:`CreationDate <szurubooru_client.tokens.UserSortToken.CreationDate>`
.. py:attribute:: LastLoginDate
Recently active first
.. py:attribute:: LastLoginTime
Alias of :attr:`LastLoginDate <szurubooru_client.tokens.UserSortToken.CreationDate>`
.. py:attribute:: LoginDate
Alias of :attr:`LastLoginDate <szurubooru_client.tokens.UserSortToken.CreationDate>`
.. py:attribute:: LoginTime
Alias of :attr:`LastLoginDate <szurubooru_client.tokens.UserSortToken.CreationDate>`
.. _special-tokens-enum:
-------------------
Special Token Enums
-------------------
.. py:class:: szurubooru_client.tokens.PostSpecialToken
.. py:attribute:: Liked
Posts liked by currently logged-in user
.. py:attribute:: Disliked
Posts disliked by currently logged in user
.. py:attribute:: Fav
Posts added to favorites by currently logged-in user
.. py:attribute:: Tumbleweed
Posts with score of 0, without comments and without favorites