Tutorial¶
This is a basic guide to the most basic usage of the module.
In this guide we will define data models for data returned by the Github API to retrieve users https://developer.github.com/v3/users/ and present this data to the UI layer in a concise way.
At the end we will also build a very simple client to the Github API.
Declaring a Model for user interfaces¶
The model below is defined according to the Single User Response from the Github V3 API.
Take a look here to see what a full json response looks like before continuing so the model definition below will make more sense.
Okay, so you see there are several fields, but only a few of the User properties are relevant for user-interface purposes.
from uiclasses import Model
class GithubUser(Model):
login: str
email: str
hireable: bool
public_repos: int
public_gists: int
followers: int
following: int
Every field declared with type annotations is considered to be visible in the user interface.
This is this is powered by dataclasses.fields()
.
Automatic getters and setters¶
Every visible field becomes a property that can be accessed directly
via instance as if it were a regular @property
user1 = GithubUser()
user1.login = "octocat"
print(user1.to_dict())
{
"login": "octocat",
}
Invisible Getters/Setters¶
Sometimes it can be useful to define properties that act on the internal data of a model without making them visible to the user interface.
UIClasses provides special annotations to achieve this with 3 variations:
Read-only Getters
Write-only Setters
Read-Write Properties
Read-only Getters¶
from uiclasses import Model
class User(Model):
id: int
username: str
token: Getter[str]
foobar = User(id=1, username="foobar", token="some-data")
print(foobar.to_dict())
print(foobar.token)
print(foobar.get_table_columns())
try:
foobar.token = 'another-value'
except Exception as e:
print(e)
{
"id": 1,
"username": "foobar",
"token": "some-data",
}
"some-data"
["id", "username"]
"'User' object has no attribute 'token'"
Write-only Getters¶
from uiclasses import Model
class User(Model):
id: int
username: str
token: Setter[str]
foobar = User(id=1, username="foobar", token="some-data")
print(foobar.to_dict())
foobar.token = 'another-value'
print(foobar.to_dict())
print(foobar.get_table_columns())
try:
print(foobar.token)
except Exception as e:
print(e)
{
"id": 1,
"username": "foobar",
"token": "some-data",
}
{
"id": 1,
"username": "foobar",
"token": "another-value",
}
["id", "username"]
"'User' object has no attribute 'token'"
Read-write Properties¶
from uiclasses import Model
class User(Model):
id: int
username: str
token: Property[str]
foobar = User(id=1, username="foobar", token="some-data")
print(foobar.token)
print(foobar.to_dict())
foobar.token = 'another-value'
print(foobar.token)
print(foobar.to_dict())
print(foobar.get_table_columns())
"some-data"
{
"id": 1,
"username": "foobar",
"token": "some-data",
}
"another-value"
{
"id": 1,
"username": "foobar",
"token": "another-value",
}
["id", "username"]