python3-commons 0.12.7__tar.gz → 0.13.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of python3-commons might be problematic. Click here for more details.
- {python3_commons-0.12.7/src/python3_commons.egg-info → python3_commons-0.13.0}/PKG-INFO +1 -5
- {python3_commons-0.12.7 → python3_commons-0.13.0}/pyproject.toml +0 -4
- python3_commons-0.13.0/src/python3_commons/auth.py +48 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/db/models/__init__.py +0 -4
- python3_commons-0.13.0/src/python3_commons/db/models/auth.py +11 -0
- python3_commons-0.13.0/src/python3_commons/db/models/rbac.py +40 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0/src/python3_commons.egg-info}/PKG-INFO +1 -5
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons.egg-info/SOURCES.txt +0 -1
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons.egg-info/requires.txt +0 -4
- {python3_commons-0.12.7 → python3_commons-0.13.0}/uv.lock +57 -430
- python3_commons-0.12.7/src/python3_commons/auth.py +0 -88
- python3_commons-0.12.7/src/python3_commons/db/models/auth.py +0 -35
- python3_commons-0.12.7/src/python3_commons/db/models/rbac.py +0 -91
- python3_commons-0.12.7/src/python3_commons/permissions.py +0 -46
- {python3_commons-0.12.7 → python3_commons-0.13.0}/.coveragerc +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/.github/workflows/checks.yml +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/.github/workflows/python-publish.yaml +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/.github/workflows/release-on-tag-push.yml +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/.gitignore +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/.pre-commit-config.yaml +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/.python-version +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/AUTHORS.rst +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/CHANGELOG.rst +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/LICENSE +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/README.md +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/README.rst +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/docs/Makefile +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/docs/_static/.gitignore +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/docs/authors.rst +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/docs/changelog.rst +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/docs/conf.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/docs/index.rst +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/docs/license.rst +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/setup.cfg +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/__init__.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/api_client.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/audit.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/cache.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/conf.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/db/__init__.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/db/helpers.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/db/models/common.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/fs.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/helpers.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/log/__init__.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/log/filters.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/log/formatters.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/object_storage.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/serializers/__init__.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/serializers/common.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/serializers/json.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/serializers/msgpack.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons/serializers/msgspec.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons.egg-info/dependency_links.txt +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/src/python3_commons.egg-info/top_level.txt +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/tests/__init__.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/tests/conftest.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/tests/test_audit.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/tests/test_cache.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/tests/test_helpers.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/tests/test_msgpack.py +0 -0
- {python3_commons-0.12.7 → python3_commons-0.13.0}/tests/test_msgspec.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python3-commons
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.13.0
|
|
4
4
|
Summary: Re-usable Python3 code
|
|
5
5
|
Author-email: Oleg Korsak <kamikaze.is.waiting.you@gmail.com>
|
|
6
6
|
License-Expression: GPL-3.0
|
|
@@ -15,14 +15,10 @@ License-File: AUTHORS.rst
|
|
|
15
15
|
Requires-Dist: aiobotocore~=2.25.0
|
|
16
16
|
Requires-Dist: aiohttp[speedups]<3.15.0,>=3.12.0
|
|
17
17
|
Requires-Dist: asyncpg~=0.30.0
|
|
18
|
-
Requires-Dist: fastapi-users-db-sqlalchemy~=7.0.0
|
|
19
|
-
Requires-Dist: fastapi-users[sqlalchemy]~=15.0.1
|
|
20
18
|
Requires-Dist: lxml~=6.0.2
|
|
21
19
|
Requires-Dist: msgpack~=1.1.2
|
|
22
20
|
Requires-Dist: msgspec~=0.19.0
|
|
23
|
-
Requires-Dist: pydantic[email]~=2.12.3
|
|
24
21
|
Requires-Dist: pydantic-settings~=2.11.0
|
|
25
|
-
Requires-Dist: python-jose==3.5.0
|
|
26
22
|
Requires-Dist: SQLAlchemy[asyncio]~=2.0.44
|
|
27
23
|
Requires-Dist: valkey[libvalkey]~=6.1.1
|
|
28
24
|
Requires-Dist: zeep~=4.3.2
|
|
@@ -21,14 +21,10 @@ dependencies = [
|
|
|
21
21
|
"aiobotocore~=2.25.0",
|
|
22
22
|
"aiohttp[speedups]>=3.12.0,<3.15.0",
|
|
23
23
|
"asyncpg~=0.30.0",
|
|
24
|
-
"fastapi-users-db-sqlalchemy~=7.0.0",
|
|
25
|
-
"fastapi-users[sqlalchemy]~=15.0.1",
|
|
26
24
|
"lxml~=6.0.2",
|
|
27
25
|
"msgpack~=1.1.2",
|
|
28
26
|
"msgspec~=0.19.0",
|
|
29
|
-
"pydantic[email]~=2.12.3",
|
|
30
27
|
"pydantic-settings~=2.11.0",
|
|
31
|
-
"python-jose==3.5.0",
|
|
32
28
|
"SQLAlchemy[asyncio]~=2.0.44",
|
|
33
29
|
"valkey[libvalkey]~=6.1.1",
|
|
34
30
|
"zeep~=4.3.2"
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from collections.abc import Sequence
|
|
3
|
+
from http import HTTPStatus
|
|
4
|
+
from typing import TypeVar
|
|
5
|
+
|
|
6
|
+
import aiohttp
|
|
7
|
+
import msgspec
|
|
8
|
+
|
|
9
|
+
from python3_commons.conf import oidc_settings
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TokenData(msgspec.Struct):
|
|
15
|
+
sub: str
|
|
16
|
+
aud: str | Sequence[str]
|
|
17
|
+
exp: int
|
|
18
|
+
iss: str
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
T = TypeVar('T', bound=TokenData)
|
|
22
|
+
OIDC_CONFIG_URL = f'{oidc_settings.authority_url}/.well-known/openid-configuration'
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
async def fetch_openid_config() -> dict:
|
|
26
|
+
"""
|
|
27
|
+
Fetch the OpenID configuration (including JWKS URI) from OIDC authority.
|
|
28
|
+
"""
|
|
29
|
+
async with aiohttp.ClientSession() as session, session.get(OIDC_CONFIG_URL) as response:
|
|
30
|
+
if response.status != HTTPStatus.OK:
|
|
31
|
+
msg = 'Failed to fetch OpenID configuration'
|
|
32
|
+
|
|
33
|
+
raise RuntimeError(msg)
|
|
34
|
+
|
|
35
|
+
return await response.json()
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
async def fetch_jwks(jwks_uri: str) -> dict:
|
|
39
|
+
"""
|
|
40
|
+
Fetch the JSON Web Key Set (JWKS) for validating the token's signature.
|
|
41
|
+
"""
|
|
42
|
+
async with aiohttp.ClientSession() as session, session.get(jwks_uri) as response:
|
|
43
|
+
if response.status != HTTPStatus.OK:
|
|
44
|
+
msg = 'Failed to fetch JWKS'
|
|
45
|
+
|
|
46
|
+
raise RuntimeError(msg)
|
|
47
|
+
|
|
48
|
+
return await response.json()
|
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
from python3_commons.db.models.auth import ApiKey as ApiKey
|
|
2
|
-
from python3_commons.db.models.auth import User as User
|
|
3
1
|
from python3_commons.db.models.auth import UserGroup as UserGroup
|
|
4
|
-
from python3_commons.db.models.rbac import RBACApiKeyRole as RBACApiKeyRole
|
|
5
2
|
from python3_commons.db.models.rbac import RBACPermission as RBACPermission
|
|
6
3
|
from python3_commons.db.models.rbac import RBACRole as RBACRole
|
|
7
4
|
from python3_commons.db.models.rbac import RBACRolePermission as RBACRolePermission
|
|
8
|
-
from python3_commons.db.models.rbac import RBACUserRole as RBACUserRole
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from sqlalchemy import String
|
|
2
|
+
from sqlalchemy.orm import Mapped, mapped_column
|
|
3
|
+
|
|
4
|
+
from python3_commons.db import Base
|
|
5
|
+
from python3_commons.db.models.common import BaseDBModel
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class UserGroup(BaseDBModel, Base):
|
|
9
|
+
__tablename__ = 'user_groups'
|
|
10
|
+
|
|
11
|
+
name: Mapped[str] = mapped_column(String, nullable=False)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
|
|
3
|
+
from sqlalchemy import CheckConstraint, ForeignKey, PrimaryKeyConstraint, String
|
|
4
|
+
from sqlalchemy.dialects.postgresql import UUID
|
|
5
|
+
from sqlalchemy.orm import Mapped, mapped_column
|
|
6
|
+
|
|
7
|
+
from python3_commons.db import Base
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RBACRole(Base):
|
|
11
|
+
__tablename__ = 'rbac_roles'
|
|
12
|
+
|
|
13
|
+
uid: Mapped[uuid.UUID] = mapped_column(UUID, primary_key=True)
|
|
14
|
+
name: Mapped[str] = mapped_column(String, unique=True, nullable=False)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class RBACPermission(Base):
|
|
18
|
+
__tablename__ = 'rbac_permissions'
|
|
19
|
+
|
|
20
|
+
uid: Mapped[uuid.UUID] = mapped_column(UUID, primary_key=True)
|
|
21
|
+
name: Mapped[str] = mapped_column(String, unique=True, nullable=False)
|
|
22
|
+
|
|
23
|
+
__table_args__ = (CheckConstraint("name ~ '^[a-z0-9_.]+$'", name='check_rbac_permissions_name'),)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class RBACRolePermission(Base):
|
|
27
|
+
__tablename__ = 'rbac_role_permissions'
|
|
28
|
+
|
|
29
|
+
role_uid: Mapped[uuid.UUID | None] = mapped_column(
|
|
30
|
+
UUID,
|
|
31
|
+
ForeignKey('rbac_roles.uid', name='fk_rbac_role_permissions_role', ondelete='CASCADE'),
|
|
32
|
+
index=True,
|
|
33
|
+
)
|
|
34
|
+
permission_uid: Mapped[uuid.UUID | None] = mapped_column(
|
|
35
|
+
UUID,
|
|
36
|
+
ForeignKey('rbac_permissions.uid', name='fk_rbac_role_permissions_permission', ondelete='CASCADE'),
|
|
37
|
+
index=True,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
__table_args__ = (PrimaryKeyConstraint('role_uid', 'permission_uid', name='pk_rbac_role_permissions'),)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python3-commons
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.13.0
|
|
4
4
|
Summary: Re-usable Python3 code
|
|
5
5
|
Author-email: Oleg Korsak <kamikaze.is.waiting.you@gmail.com>
|
|
6
6
|
License-Expression: GPL-3.0
|
|
@@ -15,14 +15,10 @@ License-File: AUTHORS.rst
|
|
|
15
15
|
Requires-Dist: aiobotocore~=2.25.0
|
|
16
16
|
Requires-Dist: aiohttp[speedups]<3.15.0,>=3.12.0
|
|
17
17
|
Requires-Dist: asyncpg~=0.30.0
|
|
18
|
-
Requires-Dist: fastapi-users-db-sqlalchemy~=7.0.0
|
|
19
|
-
Requires-Dist: fastapi-users[sqlalchemy]~=15.0.1
|
|
20
18
|
Requires-Dist: lxml~=6.0.2
|
|
21
19
|
Requires-Dist: msgpack~=1.1.2
|
|
22
20
|
Requires-Dist: msgspec~=0.19.0
|
|
23
|
-
Requires-Dist: pydantic[email]~=2.12.3
|
|
24
21
|
Requires-Dist: pydantic-settings~=2.11.0
|
|
25
|
-
Requires-Dist: python-jose==3.5.0
|
|
26
22
|
Requires-Dist: SQLAlchemy[asyncio]~=2.0.44
|
|
27
23
|
Requires-Dist: valkey[libvalkey]~=6.1.1
|
|
28
24
|
Requires-Dist: zeep~=4.3.2
|
|
@@ -28,7 +28,6 @@ src/python3_commons/conf.py
|
|
|
28
28
|
src/python3_commons/fs.py
|
|
29
29
|
src/python3_commons/helpers.py
|
|
30
30
|
src/python3_commons/object_storage.py
|
|
31
|
-
src/python3_commons/permissions.py
|
|
32
31
|
src/python3_commons.egg-info/PKG-INFO
|
|
33
32
|
src/python3_commons.egg-info/SOURCES.txt
|
|
34
33
|
src/python3_commons.egg-info/dependency_links.txt
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
aiobotocore~=2.25.0
|
|
2
2
|
aiohttp[speedups]<3.15.0,>=3.12.0
|
|
3
3
|
asyncpg~=0.30.0
|
|
4
|
-
fastapi-users-db-sqlalchemy~=7.0.0
|
|
5
|
-
fastapi-users[sqlalchemy]~=15.0.1
|
|
6
4
|
lxml~=6.0.2
|
|
7
5
|
msgpack~=1.1.2
|
|
8
6
|
msgspec~=0.19.0
|
|
9
|
-
pydantic[email]~=2.12.3
|
|
10
7
|
pydantic-settings~=2.11.0
|
|
11
|
-
python-jose==3.5.0
|
|
12
8
|
SQLAlchemy[asyncio]~=2.0.44
|
|
13
9
|
valkey[libvalkey]~=6.1.1
|
|
14
10
|
zeep~=4.3.2
|