Mercurial > libervia-backend
annotate libervia/backend/models/types.py @ 4321:2246eeeccc74
tests (unit): fix tests:
- test_ap-gateway: fix missing implementation of `client.is_local`
- test_plugin_xep_0215: fix missing return value of `has_feature`
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 30 Sep 2024 14:15:47 +0200 |
parents | ffc43219e0b2 |
children |
rev | line source |
---|---|
4296
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 #!/usr/bin/env python3 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 # Libervia models custom types |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 # Copyright (C) 2009-2024 Jérôme Poisson (goffi@goffi.org) |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # (at your option) any later version. |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # GNU Affero General Public License for more details. |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 from typing import TYPE_CHECKING, Annotated, Any, TypeAlias, cast |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 from pydantic import GetCoreSchemaHandler, GetJsonSchemaHandler |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 from pydantic.json_schema import JsonSchemaValue |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
23 from pydantic_core import core_schema |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 from twisted.words.protocols.jabber.jid import JID |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 class _JIDType: |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 """Use Twisted's JID in Python type, and serialize it to str |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 In Python, both JID and str are accepted, str are converted to JID. |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 """ |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 @staticmethod |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 def validate_jid(value: str) -> JID: |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 return JID(value) |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 @staticmethod |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 def serialize_jid(jid: JID) -> str: |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 return str(jid) |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 @classmethod |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 def __get_pydantic_core_schema__( |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 cls, source_type: Any, handler: GetCoreSchemaHandler |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 ) -> core_schema.CoreSchema: |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 return core_schema.json_or_python_schema( |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 json_schema=core_schema.no_info_after_validator_function( |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 cls.validate_jid, core_schema.str_schema() |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 ), |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 python_schema=core_schema.union_schema( |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 [ |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 core_schema.is_instance_schema(JID), |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 core_schema.no_info_after_validator_function( |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 cls.validate_jid, core_schema.str_schema() |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 ), |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 ] |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 ), |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 serialization=core_schema.plain_serializer_function_ser_schema( |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 cls.serialize_jid, when_used="json" |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 ), |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
60 ) |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
61 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
62 @classmethod |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 def __get_pydantic_json_schema__( |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 cls, schema: core_schema.CoreSchema, handler: GetJsonSchemaHandler |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 ) -> JsonSchemaValue: |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 json_schema = handler(schema) |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 json_schema.update( |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 { |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 "format": "jid", |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 "description": "A valid Jabber ID (JID) in the format " |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
71 '"user@domain/resource"', |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 } |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 ) |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 return json_schema |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
76 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
77 class _StrictJIDType(_JIDType): |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
78 """Strict version of JIDType which only accept JID in Python.""" |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
79 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
80 @classmethod |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 def __get_pydantic_core_schema__( |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 cls, source_type: Any, handler: GetCoreSchemaHandler |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
83 ) -> core_schema.CoreSchema: |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
84 return core_schema.json_or_python_schema( |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
85 json_schema=core_schema.no_info_after_validator_function( |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
86 cls.validate_jid, core_schema.str_schema() |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
87 ), |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 python_schema=core_schema.is_instance_schema(JID), |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 serialization=core_schema.plain_serializer_function_ser_schema( |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 cls.serialize_jid, when_used="json" |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
91 ), |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
92 ) |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
93 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 # We annotate the types so static type checker understand them as JID. |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 JIDType = Annotated[JID, _JIDType] |
ffc43219e0b2
core (models): add new models for `DiscoIdentity` and `JID`:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 StrictJIDType = Annotated[JID, _StrictJIDType] |